Я упростил эту проблему.
program.py
from classB import B
myClass = B(7)
myClass.print__()
myClass.bbb = 8
print(myClass.bbb)
myClass.print__()
classA.py
class A:
def __init__(self, a):
self.aaa = a
def print_(self):
print(self.aaa)
classB.py
from classA import A
class B:
def __init__(self, bb):
self.bbb = bb
self.Aclass = A(self.bbb)
def print__(self):
self.Aclass.print_()
В program.py я создал экземпляр класса myClass и был инициализирован 7. Если тогда из класса B.py будет создан экземпляр класса Ac класса ClassA, а также будет инициализирован с помощью 7, поэтому при вызове print __() он показывает что Aclass также инициализируется 7.
Проблема здесь в том, что когда я обновил myClass.bbb до 8, я также ожидал, что Aclass.aaa будет 8, но это не так.
Я мог бы решить эту проблему, выполнив еще одну функцию, например update_varA(), но не могли бы вы объяснить, почему это происходит, и лучшее решение для этого?
Вы правы в функции обновления. В вашем случае это будет (в classB.py)
class B:
def update_value(self, new_value):
self.bbb = new_value
self.AClass.aaa = new_value
[... all the other functions]
Другим способом было бы установить значение непосредственно в вашей основной программе (program.py)
myClass.AClass.aaa = 8
к трюку.
Если вы хотите погрузиться немного глубже, вы также можете переопределить __setattr__()
. В основном, когда вы делаете что-то вроде
myClass.bbb = 8
python делает это под капотом:
myClass.__setattr__('bbb', 8)
myClass является экземпляром класса здесь btw, поэтому имя немного вводит в заблуждение. Тем не менее, вы можете переопределить setattr():
class B:
def __setattr__(self, name, value):
if name=='bbb':
self.bbb = new_value
self.AClass.aaa = new_value
else:
super().__setattr__(name, value)
[... all the other functions]
но это довольно продвинуто. Вы можете прочитать об этом здесь