导入调用__new__静态方法吗?

时间:2016-09-23 03:14:11

标签: python class metaclass

我知道在调用__new__之前尝试创建类的实例时会调用__init__方法。

但我碰巧发现,使用create instance导入模块也会调用__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,我可以通过ttt看到两个__new__打印。 那么,什么时候 new 被完全调用,在这种情况下,我永远不会创建我定义的三个类的任何实例

1 个答案:

答案 0 :(得分:2)

当您使用元类来定义类时,元类被称为""隐式(调用__new__,因为这里的元类是实际的类),请参阅Invoking the metaclass。我不能说你为什么在这里看到三个打印(你只有两个类使用A作为元类,直接或间接通过继承),但这解释了两个print