【问题标题】:Does import call __new__ static method?import 是否调用 __new__ 静态方法?
【发布时间】:2017-01-31 19:05:52
【问题描述】:

我知道在调用__init__ 之前尝试创建类的实例时会调用__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,我可以看到两个ttt__new__打印。 那么,new 什么时候准确调用,在这种情况下,我从不创建我定义的三个类的任何实例

【问题讨论】:

  • 旁注:__new__ 不是静态方法。它是构造函数,它隐含地表现得像一个类方法(它接收类作为它的第一个参数,而不是类的实例),但它不是静态的; static 意味着它只是由类命名空间,而不是与它相关联。

标签: python class metaclass


【解决方案1】:

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

【讨论】:

  • 抱歉弄错了,我有两张照片,一张给B,一张给C
  • @demonguy:嗯,你没有准确传达C 的定义(class(C): 是无效的语法);如果它还涉及使用A 作为元类,那就可以解释了。
猜你喜欢
  • 2022-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-26
  • 2013-03-20
  • 1970-01-01
相关资源
最近更新 更多