在哪里更改值以便它适用于python中的所有方法?

时间:2016-10-26 14:52:23

标签: python class object methods get

我正在努力解决一开始似乎没什么大不了的问题。我正在创建一个类和一个子子类,每当我想要更改子类中的值时,它应该自动更新类和子类中的所有其他方法。让我给你举个例子。应该更改的值是shift方法中的change.shift(shift)

class Message(object):
    '''
    code that doesn't matter for this question
    '''
    def build_shift_dict(self, shift):
        '''
        code that doesn't matter for this question
        '''
        return dict

    def apply_shift(self, shift):
        '''
        code that doesn't matter for this question
        '''
        return newMessage

class PlaintextMessage(Message):
    def __init__(self, text, shift):
        '''
        code that doesn't matter for this question
        '''
        Message.__init__(self, text)
        self.shift = shift
        self.encrypting_dict = self.build_shift_dict(self.get_shift())
        self.message_text_encrypted = self.apply_shift(self.get_shift())

    def get_shift(self):
        '''
        Used to safely access self.shift outside of the class

        Returns: self.shift
        '''
        return self.shift

    def get_encrypting_dict(self):
        return self.encrypting_dict

    def get_message_text_encrypted(self):
        return self.message_text_encrypted

    def change_shift(self, shift):
        assert 0 <= shift < 26
        self.shift = shift

正如您所见,我需要在shiftapply_shift(self, shift)内更改build_shift_dict(self, shift),因为init调用中的PlaintextMessage(Message)方法会执行方法。我怎么做?当我调用get_shift(self)方法时,我会获得移位值,如果我再调用change_shift(self, shift)方法并再次调用get_shift(self),则会显示更新的shift值。所以我尝试使用get-Method更新self.encrypting_dict = self.build_shift_dict(self.get_shift())self.message_text_encrypted = self.apply_shift(self.get_shift())而不是shift,但这并没有改变任何内容。我在这里错过了什么?谢谢!

1 个答案:

答案 0 :(得分:1)

change_shift()中,只需调用其他两种方法。

def change_shift(self, shift):
    assert 0 <= shift < 26
    self.shift = shift
    self.encrypting_dict = self.build_shift_dict(self.shift)
    self.message_text_encrypted = self.apply_shift(self.shift)

您可以定义build_shift_dictapply_shift而不使用self以外的参数,只需在这些方法中使用self.shift - 您仍需要调用它们,但是您不会把任何东西传给他们,你不能把这些方法从你的程序中传递出错误的东西搞砸了。

您可以使用@property装饰器访问shift某个属性/属性 - 您不必调用它,而且可以摆脱 getter&#39; s < / em>和 setter - 您需要将shift重命名为_shift__shift,而不是程序中的其他任何位置。

像:

class Foo:
    def __init__(self, shift):
        self._shift = shift
    @property
    def shift(self):
        return self._shift
f = Foo(2)

然后您使用f.shift访问它。