【发布时间】:2020-07-17 16:12:23
【问题描述】:
我在理解 .new 魔术方法如何创建类时遇到了一些麻烦。下面是我使用的 API 示例,它使用元类从数据库中的信息动态创建对象。
class Metaclass(type):
def __new__(cls, name, bases, dict_):
print(f' cls - {cls}')
print(f' name - {name}')
print(f' bases - {bases}')
return super(Metaclass, cls).__new__(cls, name, bases, dict_)
class MyObject(object, metaclass=Metaclass):
pass
class PrimaryObject(MyObject):
pass
class SecondaryObject(MyObject):
pass
test = PrimaryObject()
运行此代码会导致 PrimaryObject 被实例化,它继承自 MyObject,而 MyObject 又继承自元类。然后调用元类中的新魔法方法,该方法对从元类继承的所有对象进行迭代 3 次,甚至包括未调用的对象:
<class '__main__.Metaclass'>
MyObject
(<class 'object'>,)
<class '__main__.Metaclass'>
PrimaryObject
(<class '__main__.MyObject'>,)
<class '__main__.Metaclass'>
SecondaryObject
(<class '__main__.MyObject'>,)
<__main__.PrimaryObject object at 0x000002214A6786D0>
new 方法如何接收这些参数,因为没有任何东西传递给它?它们是从调用它的对象中解析出来的吗?如果是这样,它为什么以及如何迭代从该对象继承但未实例化的其他对象(SecondaryObject)?
谢谢
【问题讨论】:
-
它是一个元类,它在创建类时调用,而不是在创建实例时调用。
-
@jonrsharpe 我认为使用术语“定义”而不是“创建”会更好,即“类已定义”
-
@DeepSpace 不确定是什么让它最清晰,但此时正在创建类型类的实例。
-
MyObject是MetaClass的实例;查看type(MyObject)的值,与type(int)之类的值相比。
标签: python python-3.x class metaclass