类装饰器不是每次都被调用

2024-04-20 04:44:29 发布

您现在位置:Python中文网/ 问答频道 /正文

一件看似简单的事,我却无法回避。在

registry  =  {}

def register(cls):
    registry[cls.__clsid__] = cls
    print cls
    return cls

@register
class Foo(object):
    __clsid__ = "123-456"

    def bar(self):
        pass
c=Foo()
d=Foo()

e=Foo()

输出:

^{pr2}$

现在我希望decorator被称为3时代。为什么它是否只被称为once。在


Tags: selfregisterreturnobjectfoodefbardecorator
2条回答

类修饰符被应用于类本身,并且仅在定义类时应用一次。基本上,它处理类定义并生成一个新类。在

所以你只处理一次。在

类decorator是在类被创建时应用的,而不是每次创建实例时。在

@register行仅适用于class Foo(object):语句。在导入模块时,只运行一次。在

创建实例不需要重新运行class语句,因为实例只是保留对类的引用的对象(type(c)返回Foo类对象);实例不是类对象的“副本”。在

如果您想注册实例,那么您必须在__init__或类的__new__方法中注册(也可以对其进行修饰)。__new__负责创建实例,__init__是用来初始化该实例的钩子。在

相关问题 更多 >