【问题标题】:Python: How to call super when the class itself has a decorator?Python:当类本身有装饰器时如何调用super?
【发布时间】:2015-04-21 23:59:06
【问题描述】:

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

@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. BaseItemObject 提供的基本功能
  3. 方法很容易被覆盖
  4. 简短的包装类有一个很好的概述

我怎样才能让它工作??

谢谢。

【问题讨论】:

  • @Martijn:对不起,我编辑了我的问题,现在它得到了错误消息
  • 啊……再次抱歉。我最好重读我正在写的东西。现在错误与我在应用程序中的错误相同。
  • 发布的代码不会重现该错误。代码中定义了全局Item01Objectclass 语句返回一个新类,在通过类装饰器传递后,Python 将名称 Item01Object 绑定到结果。
  • 您的代码做了一些 else 以再次解除该全局绑定。
  • 是的,我使用的类装饰器的函数返回值错误。我将再次阅读使用装饰器的文档,我不会再次发布那些简单的错误。无论如何,感谢您的快速回复!

标签: python inheritance wrapper decorator super


【解决方案1】:

好的。我解决了。是一个非常简单的错误。在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!!

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

【讨论】:

    猜你喜欢
    • 2023-02-08
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 2017-10-30
    • 2011-11-20
    • 2021-07-16
    • 2010-12-13
    • 2015-12-06
    相关资源
    最近更新 更多