我试图让我的头绕着元类,但我仍然不能真正理解它的概念。了解Python中的元类
据我所知:
任何类本身类型的“类型”的一个实例 - 因此“呼叫”一类的只是调用它的类中的方法__call__
- 这恰好是类型的__call__
。的type.__call__
的效果是完全:上类似的代码:
A类: 通 B = A()
的步骤的顺序我知道这里是:
1. type.__call__
接收A类本身作为其第一个参数。
- 它调用
A.__new__
- 以伪代码的形式,我们可以编写instance = A.__new__(cls)
作为运行的代码。
3.That返回 “A” 类的一个实例
4.然后在实例(instance.__init__()
) 调用__init__
...并返回该实例返回实例
但现在考虑下面的代码:
class MetaOne(type):
def __new__(meta, classname, supers, classdict):
print('In MetaOne.new:', meta, classname, supers, classdict, sep='\n...')
return type.__new__(meta, classname, supers, classdict)
class Eggs:
pass
print('making class')
class Spam(Eggs, metaclass=MetaOne):
data = 1
def meth(self, arg):
return self.data + arg
print('making instance')
X = Spam()
print('data:', X.data, X.meth(2))
从这个脚本的输出如下:
making class
In MetaOne.new:
...<class '__main__.MetaOne'>
...Spam
...(<class '__main__.Eggs'>,)
...{'__qualname__': 'Spam', '__module__': '__main__', 'meth': <function Spam.met
h at 0x00000000010C1D08>, 'data': 1}
making instance
data: 1 3
所以,按照我的理解,这是步骤的顺序:
由于垃圾邮件是MetaOne的一个实例,调用
X = Spam()
会尝试调用MetaOne类是不存在的__call__
方法。由于MetaOne继承了类型,因此会调用
__call__
类型为Spam
的方法作为第一个参数。
此后在MetaOne类的__new__
方法调用的土地了,但它应该包含Spam
作为第一个参数。
从哪里MetaOne类的meta
争论进入画面。
请帮我理解。