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

Python: How to call super when the class itself has a decorator?

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

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

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

    #[...]

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

但是当我实例化 class 时,出现以下错误:

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

想法:

  1. 使用 class 变量快速编辑每个 "wrapper" 项目的属性 properties
  2. BaseItemObject
  3. 提供的基本功能
  4. 方法很容易被覆盖
  5. 简短的包装class有一个很好的概述

我怎样才能让它发挥作用?

谢谢。

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

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!!

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