Python:当类本身有装饰器时如何调用super?

时间:2015-02-20 10:28:27

标签: python inheritance wrapper decorator super

我需要调用继承的类来获取它的内容和方法。但我也有一个类装饰器分配给我的包装类。我有很多包装类,希望它们尽可能短,这就是我试图让它工作的原因。

@add_properties
class Item01Object(BaseItemObject):
    properties=["quantum","size","mass"]

    def __init__(self, name=None):
        super(Item01Object, self).__init__(name)

    #[...]

@add_properties
class Item02Object(BaseItemObject):
    #[...]

但是当我上课时,我收到以下错误:

File "C:\wrapper.py", line 862, in __init__
super(Item01Object, self).__init__(name)
NameError: global name 'Item01Object' is not defined

这个想法:

  1. 使用类变量properties
  2. 快速编辑每个“包装器”项的属性
  3. BaseItemObject
  4. 给出的基本功能
  5. 方法很容易被覆盖
  6. 简短的包装类以获得良好的概述
  7. 我怎么能让它发挥作用?

    感谢。

1 个答案:

答案 0 :(得分:0)

行。我解决了这是一个非常简单的错误。在add_properties我返回了我的类的对象,但它需要返回类本身。所以我的构造函数在我的类完全构建之前被执行了。所以我只是将其更改为以下内容并且工作正常:

def add_properties( ItemObject ):
    for propName, cls in PropertyContainer.__dict__.iteritems():
        if propName in ItemObject.properties:
            setattr(ItemObject, propName, cls.__dict__[propName])
    return ItemObject # <- Do not return an object!!

这是我第一次在复杂的结构中使用很多装饰器,但我真的很喜欢这个想法和结构。