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())
.