使用d时重写静态变量的值

2024-06-02 07:16:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个类,如下所示:

class Simon:

    name = 'Simon'

    @classmethod
    def says(cls, sentence):
        return '%s says: %s' % (cls.name, sentence)

如果我想坐下:

^{pr2}$

为了用另一个名称替换Simon,比如说,Eva,我可以这样子类化它:

class Eva(Simon):

    name = 'Eva'

结果是:

>>> Eva.says('stand up')
'Eva says: stand up'

现在我想通过创建一个名为^{的装饰器将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'

如何覆盖该值?在

如果标题不准确,请帮助我改进标题,谢谢!在


Tags: namereturndefargclassclspastup
2条回答

我不完全确定您要在这里实现什么,但我想您需要将cls.says传递给方法:

return cls.to_past_tense(cls, cls.says)(*arg, **kw)

您正在使用Simon.says,检索绑定类。在

如果要获取重写的类方法,但要将其绑定到当前类,请使用^{} proxy object

@classmethod
def says(cls, *arg, **kw):
    return cls.to_past_tense(cls, super().says)(*arg, **kw)

super()对象将搜索该类的MRO,在Simon上找到says方法,然后为您将其绑定到cls对象,这样cls.name值仍然从Eva查找:

^{pr2}$

相关问题 更多 >