导入是否调用 __new__ 静态方法?
Does import call __new__ static method?
我知道在调用 __init__
之前尝试创建 class 的实例时会调用 __new__
方法。
但是我偶然发现,导入一个没有创建实例的模块也会调用__new__
假设我有这个:
a.py:
import abc
class A(abc.ABCMeta):
def __new__(cls, name, bases, namespace):
print("ttt:", cls, name, bases, namespace)
retval = abc.ABCMeta.__new__(cls, name, bases, namespace)
return retval
class B(object):
__metaclass__ = A
和
b.py
import a
class C(B):
def a():
pass
然后我执行 python b.py
,我可以看到 __new__
打印了两个 ttt
。
因此,new 何时被准确调用,在这种情况下,我从未创建我定义的三个 classes 的任何实例
当您使用元class定义class时,元class隐式为"called"(它调用__new__
,因为元class 这里是实际的 class),参见 Invoking the metaclass。我不能说为什么你在这里看到三个印刷品(你只有两个 classes 使用 A
作为元 class,直接或间接通过继承),但这解释了两个print
s.
我知道在调用 __init__
之前尝试创建 class 的实例时会调用 __new__
方法。
但是我偶然发现,导入一个没有创建实例的模块也会调用__new__
假设我有这个:
a.py:
import abc
class A(abc.ABCMeta):
def __new__(cls, name, bases, namespace):
print("ttt:", cls, name, bases, namespace)
retval = abc.ABCMeta.__new__(cls, name, bases, namespace)
return retval
class B(object):
__metaclass__ = A
和
b.py
import a
class C(B):
def a():
pass
然后我执行 python b.py
,我可以看到 __new__
打印了两个 ttt
。
因此,new 何时被准确调用,在这种情况下,我从未创建我定义的三个 classes 的任何实例
当您使用元class定义class时,元class隐式为"called"(它调用__new__
,因为元class 这里是实际的 class),参见 Invoking the metaclass。我不能说为什么你在这里看到三个印刷品(你只有两个 classes 使用 A
作为元 class,直接或间接通过继承),但这解释了两个print
s.