Невозможно перезаписать атрибуты объекта в связанном объекте - PullRequest
0 голосов
/ 15 января 2019

У меня есть класс контроллера, который имеет некоторые атрибуты. Атрибуты в этом классе иногда могут быть перезаписаны значениями, хранящимися в базе данных. К сожалению, я столкнулся с проблемой, которая решает довольно фундаментальную проблему в ООП, я думаю, поэтому я действительно хотел бы понять, что я делаю неправильно, вместо того, чтобы писать обходной путь.

Мой реальный код, конечно, намного больше, но следующее упрощение действительно должно показать проблему.

class Project():
    def __init__(self):
        self.beams = 10

class Controller():
    def __init__(self):
         self.project = Project()

    def proc(self):
        self.r = Register(self.project)
        self.r.load()

class Register():
    def __init__(self, project):
         self.project = project

    def load(self):
        p2 = Project()
        p2.beams = 5

        self.project = p2
        # self.project.beams = 4

c = Controller()
print(c.project.beams)

c.proc()
c.r.load()

print(c.project.beams)

Ожидаемые результаты:

10
5

Что я получаю:

10
10

Обратите внимание, что когда я использую строку комментария self.project.beams = 4, результат будет:

10
4

Очевидно, я не могу перезаписать атрибут project в классе регистров, но почему бы и нет?

1 Ответ

0 голосов
/ 15 января 2019

То, что происходит, - это то, что экземпляр проекта в вашем классе контроллера не меняется, когда вы передаете его в класс Register, но проект в классе Register изменился, и это изменение не будет передано классу Controller, и путь к нему будетделать что-то вроде этого

class Controller():
    def __init__(self):
         self.project = Project()

    def proc(self):
        self.r = Register(self.project)
        self.r.load()
        self.project = self.r.project

Это дает мне желаемый результат, я не знаю никаких других требований, но так я бы поступил в этом направлении.

...