视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python中的元类(metaclass)是什么
2020-11-27 14:09:43 责编:小采
文档
 在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。显然,它在父类中找到了。

我们可以看到使用元类的一个好处了,即他可以让子类隐式的继承一些东西。

下载本文
显示全文
专题