刚開始接触到Python新式类中的元类的概念的时候非常是纠结了下。。不知道这是个啥东西。。。

用下面几个定义来说明吧:

(1)Python中,类也是对象。。仅仅只是这样的对象比較的特殊,他用于创建别的对象

(2)元类也是一种类,仅仅只是它更特殊。。。他是用来创建别的类的类。。。(呵呵,是不是非常拗口)

先来看一段代码吧:

class Fjs(object):
def __init__(self, name):
self.name = name def hello(self):
print "hello by %s" % (self.name,) print Fjs.__class__

这里的输出是:<type 'type'>

这里该怎么理解呢。。?依照上面说的。。。Fjs类事实上也是一种对象。。。那么Fjs类对象是由什么类来创建的呢。。?嗯。。就是由type类来创建的。。。

接下来来更改一下代码,换一种方法来创建Fjs类型:

def __init__(self, name):
self.name = name def hello(self):
print "hello by %s" % (self.name,) attrs = dict()
attrs["__init__"] = __init__
attrs["hello"] = hello Fjs = type("Fjs", (object,), attrs) fjs = Fjs("fjs")
fjs.hello()

这里也创建了Fjs类型,跟上面定义的Fjs类型是一样的。。只是这里换了一种定义的方式。。。

这里就看出来了type这个类是干啥用的了吧。。。

嗯,接下来引入元类的概念。。。。

在python中,类型的定义(新式类),事实上终于都是通过某个元类来创建一个类型对象。。。。普通情况下,假设没有特别指出。。。那么默认的元类就是type。。。通过上面说的两段代码,应该可以比較清楚的理解这个问题吧。。。

接下来我们写代码来看看自己定义元类吧:

class Meta_Fjs(type):
def __init__(self, name, parents, attrs):
print "開始创建类型对象"
super(Meta_Fjs, self).__init__(name, parents, attrs) class Fjs(object):
__metaclass__ = Meta_Fjs def __init__(self, name):
self.name = name def hello(self):
print "hello by %s" % (self.name, )

这里定义了一个Meta_Fjs元类,它继承了type,然后要做的事情,事实上也非常easy,就是调用type来创建类型对象就好了。。

在定义的Fjs类型中,我们指定了这个类的__metaclass__属性为刚刚创建的Meta_Fjs元类。。。

这样,在创建Fjs类型的时候,事实上就是通过Meta_Fjs来创建的了。。。。

当然这里事实上没有做什么事情。。。接下来做一些略微实用的事情吧:

class Meta_Fjs(type):
def __init__(self, name, parents, attrs):
if "__str__" not in attrs:
raise TypeError("未定义__str__方法")
super(Meta_Fjs, self).__init__(name, parents, attrs) class Fjs(object):
__metaclass__ = Meta_Fjs def __init__(self, name):
self.name = name def hello(self):
print "hello by %s" % (self.name, )

这里在创建类型的时候,就要求必需要有__str__方法,假设没有的话,那么将会抛出异常,那么在执行的时候,接下的Fjs类型的定义就将会抛出异常。。想要顺利的通过,就需要在Fjs的定义中增加__str__方法

到这里为止,python的元类的大体上的一些概念就应该知道了吧。。。

事实上,普通情况下我们都不会用到元类相关的东西。。。只是在一些框架设计,API设计等地方的时候元类还是能够发挥关键的数据的。。。

最新文章

  1. hdu 4481 Time travel(高斯求期望)(转)
  2. 【问题】AndroidStudio导入项目一直卡在Building gradle project infod的最快速解决方案
  3. Centos 7U盘安装
  4. Codevs 1506 传话(floyd大法好)。
  5. 封装NPOI导出含下拉列表的Excel
  6. 2013 Multi-University Training Contest 10
  7. Windows Server R2服务器 IIS7 部署MVC3网站
  8. 将某个Qt4项目升级到Qt5遇到的问题(13条方法)
  9. TCP/IP笔记 三.运输层(2)——TCP 流量控制与拥塞控制
  10. oschina 编程语言
  11. javascript事件冒泡
  12. Java经典编程题50道之十四
  13. var dataObj=eval(&quot;(&quot;+data+&quot;)&quot;);//转换为json对象(解决在ajax返回json格式数据的时候明明正确的获取了返回值但是却就是进不去success方法的问题。格式错误)
  14. 【shell脚本练习】网卡信息和简单日志分析
  15. Oracle事务与锁 知识点摘记
  16. 一致性Hash算法在数据库分表中的实践
  17. web框架开发-Django简介
  18. React Native踩坑之旅
  19. Codeforces1101G (Zero XOR Subset)-less 【线性基】【贪心】
  20. ECS——安装nginx

热门文章

  1. 安装numpy、nltk问题汇总
  2. StackExchange.Redis 使用
  3. 引用类型之object类型
  4. 探索static——不需要能够使用该类实例?
  5. iOS开发无第三方控件的援助达到的效果侧边栏
  6. CDH秘籍(两):cloudera Manager存储监控数据
  7. [python]自问自答:python -m参数? (转)
  8. 开源GUI-Microwindows之程序入口分析
  9. 初探boost之progress_display库学习笔记
  10. Coco2d-x android win7 Python 游戏开发环境的搭建