导入是否调用 __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,直接或间接通过继承),但这解释了两个prints.