在 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 中继承装饰函数?的主要内容,如果未能解决你的问题,请参考以下文章