我不太确定如何在继承的方法上使用装饰器.通常装饰器放在定义之前,但对于继承的函数,定义是在父类而不是子类中给出的.我想避免重写子类中方法的定义,只需指定将装饰器放在继承的方法周围.
为了让自己更清楚,这是我的意思的一个实例:
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()
它在这个例子中完成的方式有效,但它看起来有些奇怪,用原始方法调用替换方法只能放置装饰器.此外,为了使其工作,需要将该方法定义为父类中的类方法.
我错过了什么吗?经验丰富的开发人员会如何做到
任何帮助,见解,评论和免费咖啡都非常感谢!
你不必须使用在装饰语法装饰.它只是一个可调用的:
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)