Как получить доступ к атрибуту из отдельного тела метода атрибутов? - PullRequest
0 голосов
/ 13 марта 2020

В настоящее время у меня есть класс с несколькими атрибутами. Каждый из этих атрибутов имеет свои собственные методы. Структура выглядит следующим образом.

    class A(object):
        def __init__(self,B,C):
            self.attribute_B = B
            self.attribute_C = C

    class B():
        def foo(self):
            #Very relevant and important code
            A.attribute_C = None
            return result

Это упрощенная версия структуры. То, что я хотел бы знать, это как изменить attribute_ C внутри тела функции attribute_B следующим образом.

beta = B()
charlie = C()
alpha = A(beta,charlie)
print(alpha.attribute_C) # prints C
alpha.attribute_B.foo()
print(alpha.attribute_C) # prints None

Я хочу изменить атрибут A в теле функции одного из его атрибутов. Я надеюсь, что разъяснил вопрос. Любая помощь будет оценена! Спасибо!

1 Ответ

1 голос
/ 14 марта 2020

OOP означает инкапсуляцию. Экземпляру b из B нельзя разрешать изменять параметр экземпляра a из A, если только: 1. a не является атрибутом b или 2. a является параметр метода b. Поскольку b является параметром a, было бы очень плохо иметь a параметр b. Следовательно, вы должны передать a в качестве параметра.

Вот рабочий код, который учитывает инкапсуляцию:

class A(object):
    def __init__(self, b, c):
        self.attribute_b = b
        self.attribute_c = c

class B():
    def foo(self, a):
        a.attribute_c = None
        return "result"

beta = B()
charlie = "C"
alpha = A(beta, charlie)
print(alpha.attribute_c) # prints C
alpha.attribute_b.foo(alpha)
print(alpha.attribute_c) # prints None

Но это действительно плохой дизайн. Потому что однажды вы увидите это:

alpha1.attribute_b.foo(alpha2)

И у вас нет способа предотвратить это. Вот лучший код:

class A(object):
    def __init__(self, b, c):
        self.attribute_b = b
        self.attribute_c = c

    def foo(self):
        self.attribute_b.foo(self)

class B():
    def foo(self, a):
        a.attribute_c = None
        return "result"

beta = B()
charlie = "C"
alpha = A(beta, charlie)
print(alpha.attribute_c) # prints C
alpha.foo()
print(alpha.attribute_c) # prints None

Примечание: Шаблон State использует аналогичный дизайн. Context имеет параметр State. Метод handle State принимает ссылку на Context в качестве параметра, чтобы иметь возможность изменить текущее состояние путем вызова context.set_state(NextState()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...