我正在尝试了解元类在python 3中的工作方式。我想知道的是:调用哪些函数,按什么顺序以及它们的签名和返回。
例如,我知道当使用元metaclass, name_of_subclass, bases参数作为实例来实例化具有metaclass, name_of_subclass, bases会调用__prepare__ metaclass, name_of_subclass, bases并且返回一个字典metaclass, name_of_subclass, bases该字典表示实例化对象的未来命名空间。
我觉得我很了解__prepare__在此过程中的步骤。 不过,我没有的是__init__ , __init__ __new__和__call__ 。 他们的观点是什么? 他们返回什么? 他们如何相互呼唤,或者总体而言,流程如何进行? 目前,我仍在了解何时调用__init__ 。
这是我一直在弄乱的一些代码来回答我的问题:
#!/usr/bin/env python3
class Logged(type):
@classmethod
def __prepare__(cls, name, bases):
print('In meta __prepare__')
return {}
def __call__(subclass):
print('In meta __call__')
print('Creating {}.'.format(subclass))
return subclass.__new__(subclass)
def __new__(subclass, name, superclasses, attributes, **keyword_arguments):
print('In meta __new__')
return type.__new__(subclass, name, superclasses, attributes)
def __init__(subclass, name, superclasses, attributes, **keyword_arguments):
print('In meta __init__')
class Thing(metaclass = Logged):
def __new__(this, *arguments, **keyword_arguments):
print('In sub __new__')
return super(Thing, this).__new__(this)
def __init__(self, *arguments, **keyword_arguments):
print('In sub __init__')
def hello(self):
print('hello')
def main():
thing = Thing()
thing.hello()
if __name__ == '__main__':
main()
通过这个和一些谷歌搜索,我知道__new__是一个静态方法,该方法返回某个对象的实例(通常是定义了__new__的对象,但并非总是如此),并且在创建__init__会调用该实例。 按照这种逻辑,我对为何未调用Thing.__init__()感到困惑。 有人可以照亮吗?
该代码的输出显示“ hello”,因此正在创建Thing的实例,这进一步使我对init感到困惑。 这是输出:
In meta __prepare__
In meta __new__
In meta __init__
In meta __call__
Creating
In sub __new__
hello
理解元类的任何帮助将不胜感激。 我已经阅读了很多教程,但是我错过了其中一些细节。