我正在努力解决一开始似乎没什么大不了的问题。我正在创建一个类和一个子子类,每当我想要更改子类中的值时,它应该自动更新类和子类中的所有其他方法。让我给你举个例子。应该更改的值是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
正如您所见,我需要在shift
和apply_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,但这并没有改变任何内容。我在这里错过了什么?谢谢!
答案 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_dict
和apply_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
访问它。