在 Python 中继承装饰函数?

Posted

技术标签:

【中文标题】在 Python 中继承装饰函数?【英文标题】:Inheriting decorating functions in 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')

【问题讨论】:

***.com/questions/3001138/… 【参考方案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/命名空间,模块也是命名空间。我有时使用静态方法而不是函数,所以我可以依赖基于类的调度,但这里不是这种情况,因为无论如何你都必须硬编码父类的类名。

以上是关于在 Python 中继承装饰函数?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中继承泛型

在python中继承私有变量[重复]

在 Python 中继承 int

在 C++0x 中继承构造函数

在python中继承线程类

JavaScript中继承的实现方式