Python中的元类(metaclass)是什么
python中的元类是指用来创建类的对象。python中的type()函数实际上就是一个元类,type()函数用来创建所有类的元类。如果要创建自定义的元类,也要从type中继承。
在python中,类也是对象,当我们使用class关键词创建一个类的时候,Python解释器仅仅是扫描一下class定义的语法,然后调用type()函数创建出class。那么你知道创建类的是什么吗?其实他是元类。
元类是什么?
元类实际上就是用来创建类的对象。
为了帮助我们理解,我们可以这样想,我们创建类就是为了创建类的实例,同样的,我们创建元类就是为了创建类。
元类就是类(实例)的类,就像下面这样:
Metaclass() = class class() = object # object==>实例
理解了什么是元类,我们再来看一看type()函数。
其实type就是一个元类,type就是我们用来创建所有的类的元类。(如果我们要创建自己定义的元类的话,也要从type中继承)
元类的工作原理:
我们来看一下下面这个例子
class ReedSunMetaclass(type): pass class Foo(object, metaclass = ReedSunMetaclass): pass class Bar(Foo): pass
首先,我们创建了一个元类ReedSunMetaclass
(注意!按照默认习惯,元类的类名总是以Metaclass结尾,以便清楚地表示这是一个元类)。
然后,我们又用元类ReedSunMetaclass创建了一个Foo类。
(同时,Foo类的属性__metaclass__就变成了ReedSunMetaclass)。
最后,我们创建了一个子类Bar继承自Foo。
我们来试着理解一下在python内部是怎么执行这几个步骤的:
对于父类Foo,Python会在类的定义中寻找__metaclass__属性,如果找到了,Python就会用它来创建类Foo,如果没有找到,就会用内建的type来创建这个类。很显然,它找到了。
对于子类Bar, python会先在子类中寻找__metaclass__属性,如果找到了,Python就会用它来创建类Bar,如果没有找到,就再从父类中寻找,直到type。显然,它在父类中找到了。
我们可以看到使用元类的一个好处了,即他可以让子类隐式的继承一些东西。
以上就是Python中的元类(metaclass)是什么的详细内容,更多请关注其它相关文章!