pull/71/merge
谭九鼎 2020-10-19 14:29:26 +08:00 committed by GitHub
commit 38eb82476b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 3 additions and 3 deletions

View File

@ -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 函数来创建这个类。如果还不怎么理解,看下下面的流程图:
![__metaclass__的介绍](https://user-gold-cdn.xitu.io/2017/9/6/06c5a4390887abd3d79401848742f5ce)
@ -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。