【发布时间】:2014-09-06 06:00:48
【问题描述】:
我不太确定如何在继承的方法上使用装饰器。通常装饰器放在定义之前,但对于继承的函数,定义是在父类而不是子类中给出的。我想避免在子类中重写方法的定义,而只是指定将装饰器放在继承的方法周围。
为了让自己更清楚,这里是我的意思的一个工作示例:
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()
在这个例子中它的工作方式是可行的,但在我看来有点奇怪,将方法替换为对原始方法的调用只是为了能够放置装饰器。此外,要使其工作,该方法需要在父类中定义为类方法。
我错过了什么吗?有经验的开发人员如何做到这一点?
非常感谢任何帮助、见解、批评性的 cmets 和免费咖啡!
【问题讨论】:
-
我没有关注你。你为什么把
gets_drink换成原来的电话? -
您的意思是您想知道使用装饰器是否比使用
super()调用原始方法更好? -
@MartijnPieters:最初我想修改子类对象的一些参数,据我所知,这可以通过装饰器轻松完成。
-
我没有真正看到它;您可以轻松地为新的覆盖方法赋予不同的签名。您不必必须使用与父类的重写方法相同的参数。
-
@MartijnPieters:是的,我知道。而且我很清楚,如果我只是覆盖该方法,那么上面的这个虚拟示例会看起来更好。但问题是一个更普遍的问题,装饰器很有用,假设对于父类我们的方法不需要装饰器,但对于子类它需要。在这种情况下,我会寻找一个看起来像示例的解决方案。你会采取不同的方式吗?
标签: python python-2.7 inheritance decorator python-decorators