Переменная класса обновления Python

1

Я упростил эту проблему.

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(), но не могли бы вы объяснить, почему это происходит, и лучшее решение для этого?

Теги:
class
python-3.x

1 ответ

1
Лучший ответ

Вы правы в функции обновления. В вашем случае это будет (в 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]

но это довольно продвинуто. Вы можете прочитать об этом здесь

  • 0
    Спасибо за ответ!!! Я посмотрю больше о последнем!
  • 0
    Если бы bbb не был числом и был изменяемым, как список, тогда мой код работал бы?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню