【问题标题】:Class decorator not being called everytime不是每次都调用类装饰器
【发布时间】:2017-03-02 13:24:49
【问题描述】:

一个看似简单的事情,我无法解决。

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()

输出:

<class '__main__.Foo'>

现在我希望装饰器被称为3 次。为什么它只被称为once

【问题讨论】:

  • 那么你想在这里实现什么?一个类对象只创建一次;您不是在创建更多类,而是在创建 实例。那些Foo() 调用不会重新执行class 语句。

标签: python python-2.7 decorator python-decorators


【解决方案1】:

类装饰器在创建类时应用,而不是每次创建实例时。

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

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

如果你想注册instances,你要么必须在类的__init____new__ 方法中注册(也可以进行装饰)。 __new__ 负责创建实例,__init__ 是为初始化该实例而调用的钩子。

【讨论】:

  • class 不只是一个在创建object 时就存在的模板
  • @vks:不,类是对象。然后调用该对象会生成一个实例,该实例保留对该类的引用。通过解析引用属性,例如,这就是找到方法的方式。
  • stackoverflow.com/questions/6760685/… 我们有一个类的单例装饰器......它只允许一个对象......如果装饰器只被调用一次,那么它是如何管理的呢?
  • 该问题中的类装饰器不返回类对象。它改为返回一个函数。您根本没有必须从类装饰器返回类对象。您只需要返回将绑定到类名的 something
  • 好的,但是当我调用新对象时它仍然不会被调用,对吗?那么这是如何处理的呢?
【解决方案2】:

类装饰器被应用到类本身,并且只在定义类时应用一次。基本上,它处理类定义并生成一个新类。

所以你只需要处理一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多