Этот вопрос относится к использованию декоратора @property внутри класса в Python. Я хочу создать класс с двумя открытыми атрибутами (скажем, a и b). Я также хочу, чтобы у класса был еще один открытый атрибут (скажем, c), который всегда равен некоторому вычислению, основанному на других атрибутах в классе (скажем, a + b = c). Атрибут c должен быть общедоступным, но из-за зависимости от a и b я не хочу, чтобы он был общедоступным, если это возможно.
Блок кода ниже не будет работать, потому что, когда self.a установлен в строке 3, вызывается a.setter, который вызывает AttributeError, потому что self.b в строке 14 еще не установлен.
Правильно ли использовать @property декоратор в этих обстоятельствах?
Какой самый Pythonic способ правильно установить атрибуты a, b и c во время метода инициализации? В идеале, без необходимости определять отношения между a, b и c в более чем одном месте, если это возможно (т.е. в отличие от приведенного ниже кода, где отношения между a, b и c определены в строках 13 и 22)?
Кроме того, возможно ли принудительно установить, что пользователь не может установить значение c напрямую, и какой самый питонский способ сделать это?
class ExampleClass1:
def __init__(self, a, b):
self.a = a
self.b = b
@property
def a(self):
return self._a
@a.setter
def a(self, a):
self._a = a
self.c = self._a + self.b
@property
def b(self):
return self._b
@b.setter
def b(self, b):
self._b = b
self.c = self._b + self.a