我不太确定如何在继承的方法上使用装饰器。通常装饰器放在定义之前,但对于继承的函数,定义是在父类而不是子类中给出的。我想避免重写子类中方法的定义,只需指定将装饰器放在继承的方法周围。
为了让自己更清楚,这是我的意思的一个实例:
class Person():
def __init__(self, age):
self.age = age
@classmethod
def gets_drink(cls, ):
print "it's time to get a drink!"
return "A beer"
def dec(some_f):
def legal_issue(obj,):
some_f(obj)
return 'A Coke'
return legal_issue
class Child(Person):
def __init__(self, age):
Person.__init__(self, age=age)
#in principle i'd like to write
#@dec
#self.gets_drink
#which does not work
#the only working way I found is by defining the method as a classmethod
#and write this:
@dec
def gets_drink(self, ):
return Person.gets_drink()
dad = Person(42)
son = Child(12)
print dad.gets_drink()
print son.gets_drink()
在这个例子中完成它的方式有效,但它看起来有些奇怪,用原始方法调用替换方法只能放置装饰器。此外,为了使其工作,需要将该方法定义为父类中的类方法。
我错过了什么吗?经验丰富的开发人员将如何做到这一点?
非常感谢任何帮助,见解,评论和免费咖啡!
答案 0 :(得分:11)
你没有 在装饰器语法中使用装饰器。它只是一个可以调用的:
class Child(Person):
def __init__(self, age):
Person.__init__(self, age=age)
gets_drink = dec(Person.gets_drink.__func__)
这将装饰器的返回值作为具有相同名称的方法添加到子类。 __func__
属性解包绑定(类)方法,检索原始函数。
请注意,您的新方法现在是常规方法,而不是类方法,您必须在classmethod()
调用中重新包装结果。
这是因为语法
@decorator_expression
def function_definition():
pass
只是语法糖:
def function_definition():
pass
function_definition = decorator_expression(function_definition)