你似乎把两者混淆了
__new__
还有元类。
被调用来创建一个新对象(一个类的实例,一个元类的类),它不是一个“类创建”挂钩。
-
Foo(...)
翻译成
type(Foo).__call__(Foo, ...)
看见
special method lookups
这是为什么。这个
type()
类的定义是它的元类。
-
type.__call__
在以下情况下使用的实现
Foo
是将调用的自定义Python类
__新的__
__init__
方法,如果结果确实是
福
类别:
def __call__(cls, *args, **kwargs): # Foo(...) -> cls=Foo
instance = cls.__new__(cls, *args, **kwargs) # so Foo.__new__(Foo, ...)
if isinstance(instance, cls):
instance.__init__(*args, **kwargs) # Foo.__init__(instance, ...)
return instance
Foo.__new__
当
仅当
属于
福
都是创造出来的。
__新的__
足以初始化实例的属性。要不是
不变的
int
或
tuple
,您只能使用
__新的__
准备新的实例状态,因为一旦创建了不可变对象,就不能更改其属性。
__新的__
当您想要更改什么类型的实例时,它也很有用
ClassObj()
生成(例如创建单例或生成专门的子类)。
相同的
__call__
__新的__
也许
这个过程适用于元类。A.
class Foo: ...
class Spam(metaclass = debugmeta): ...
,就是说
debugmeta('Spam', (), {...})
被称为,意思是
debugmeta.__new__(debugmeta, 'Spam', (), {...})
被称为。
你的第一次尝试
A.
背景
Spam.__new__
不起作用,因为你是
不创建类对象
那里相反
super().__new__(cls)
创建一个空的
Spam()
例子
vars()
返回一个空字典,然后
debugmethods()
结果什么也没做。