mirror of https://github.com/TwoWater/Python
Merge 5298893088
into 39b1d5bad7
commit
38eb82476b
|
@ -34,9 +34,9 @@ class MyObject(object):
|
|||
|
||||
如果是这样写的话,Python 就会用元类来创建类 MyObject。
|
||||
|
||||
当你写下 `class MyObject(object)`,但是类对象 MyObject 还没有在内存中创建。P
|
||||
当你写下 `class MyObject(object)`,但是类对象 MyObject 还没有在内存中创建。
|
||||
|
||||
ython 会在类的定义中寻找 `__metaclass__` 属性,如果找到了,Python 就会用它来创建类 MyObject,如果没有找到,就会用内建的 type 函数来创建这个类。如果还不怎么理解,看下下面的流程图:
|
||||
Python 会在类的定义中寻找 `__metaclass__` 属性,如果找到了,Python 就会用它来创建类 MyObject,如果没有找到,就会用内建的 type 函数来创建这个类。如果还不怎么理解,看下下面的流程图:
|
||||
|
||||

|
||||
|
||||
|
@ -50,7 +50,7 @@ class Foo(Bar):
|
|||
|
||||
它的判断流程是怎样的呢?
|
||||
|
||||
首先判断 Foo 中是否有 `__metaclass__` 这个属性?如果有,Python 会在内存中通过 `__metaclass__` 创建一个名字为 Foo 的类对象(注意,这里是类对象)。如果 Python 没有找到`__metaclass__` ,它会继续在 Bar(父类)中寻找`__metaclass__` 属性,并尝试做和前面同样的操作。如果 Python在任何父类中都找不到 `__metaclass__` ,它就会在模块层次中去寻找 `__metaclass__` ,并尝试做同样的操作。如果还是找不到` ` `__metaclass__` ,Python 就会用内置的 type 来创建这个类对象。
|
||||
首先判断 Foo 中是否有 `__metaclass__` 这个属性?如果有,Python 会在内存中通过 `__metaclass__` 创建一个名字为 Foo 的类对象(注意,这里是类对象)。如果 Python 没有找到`__metaclass__` ,它会继续在 Bar(父类)中寻找`__metaclass__` 属性,并尝试做和前面同样的操作。如果 Python在任何父类中都找不到 `__metaclass__` ,它就会在模块层次中去寻找 `__metaclass__` ,并尝试做同样的操作。如果还是找不到 `__metaclass__` ,Python 就会用内置的 type 来创建这个类对象。
|
||||
|
||||
其实 `__metaclass__` 就是定义了 class 的行为。类似于 class 定义了 instance 的行为,metaclass 则定义了 class 的行为。可以说,class 是 metaclass 的 instance。
|
||||
|
||||
|
|
Loading…
Reference in New Issue