【发布时间】:2015-11-13 03:15:11
【问题描述】:
我创建了一个如下所示的类:
class Simon:
name = 'Simon'
@classmethod
def says(cls, sentence):
return '%s says: %s' % (cls.name, sentence)
如果我想让Simon说坐下,我可以这样做:
>>> Simon.says('sit down')
'Simon says: sit down'
要将 Simon 替换为另一个名字,比如 Eva,我可以这样子类化它:
class Eva(Simon):
name = 'Eva'
结果:
>>> Eva.says('stand up')
'Eva says: stand up'
现在我想通过创建一个名为 to_past_tense 的装饰器将 says 更改为 said:
class Eva(Simon):
name = 'Eva'
def to_past_tense(self, func):
def wrapper(*arg, **kw):
present_tense = func(*arg, **kw)
past_tense = present_tense.replace('says', 'said')
return past_tense
return wrapper
@classmethod
def says(cls, *arg, **kw):
return cls.to_past_tense(cls, Simon.says)(*arg, **kw)
如果我这样做:
>>> Eva.says('stand up')
我期待的是这样的:
'Eva said: stand up'
但事实上我得到了这个
'Simon said: stand up'
如何覆盖该值?
如果标题不够准确和清晰,请帮我改进,谢谢!
【问题讨论】:
-
查看硬编码的类名:
return cls.to_past_tense(cls, Simon.says)(*arg, **kw) -
我已经尝试了@Daniel Roseman 的建议,但没有任何意义。
标签: python python-3.x inheritance decorator python-decorators