【问题标题】:Inheriting decorating functions in Python?在 Python 中继承装饰函数?
【发布时间】:2013-09-24 10:52:42
【问题描述】:

如何在 Python 中使用继承的装饰器?

class Foo:
    @staticmethod
    def keyErrorOnRed(f, colour):
        if colour == "red":
            raise KeyError("Better dead than red")
        return lambda: f(*args, **kwargs)

class Bar(Foo):
    @keyErrorOnRed("red")
    def __init__(self, a, b):
        self.vars = a, b

if __name__ == '__main__':
    barObj = Bar('can', 'haz')

【问题讨论】:

标签: python inheritance static-methods instantiation python-decorators


【解决方案1】:
def keyErrorOnRed(colour):
    def decorate(f):
        def wrapped(*args, **kwargs):
            if colour == "red":
                raise KeyError("Better dead than red")
            return f(*args, **kwargs)
        return wrapped
    return decorate

class Bar(object):
    @keyErrorOnRed("black")  #keyErrorOnRed("black")(Bar.__init__)(self, a, b)
    def __init__(self, a, b):
        self.vars = a, b

【讨论】:

  • keyErrorOnRed 是父类的@staticmethod 时,最简洁的方法是什么?
  • @AT 把这个函数放到那个类中(Foo),然后用@Foo.keyErrorOnRed("black")作为Bar类的装饰器。
  • 太好了,谢谢。 ([黑色[未失败]](ideone.com/JmONvR),[红色[失败]](ideone.com/A9L2xM))。完美!
  • @AT 很高兴有帮助。 :-)
【解决方案2】:

技术上正确的答案:

class Bar(Foo):
    @Foo.KeyErrorOnRed
    def __init__(self, a, b):
        self.vars = a, b

但是当一个普通的函数可以做的时候,让它成为一个静态方法有什么意义呢?

【讨论】:

  • 为了方便命名空间。在父类中也有一些成员变量。等等,所以不需要@? - 编辑:这不起作用 - ideone.com/gYStaM
  • 是的,'@' 是必需的,我的错误。 wrt/命名空间,模块也是命名空间。我有时使用静态方法而不是函数,所以我可以依赖基于类的调度,但这里不是这种情况,因为无论如何你都必须硬编码父类的类名。
猜你喜欢
  • 2011-03-01
  • 2011-03-23
  • 2014-02-02
  • 2022-01-18
  • 2017-08-09
  • 2018-01-16
  • 2014-03-07
  • 2018-04-17
  • 2011-09-18
相关资源
最近更新 更多