Использование декоратора @property для взаимосвязанных атрибутов в классе Python - PullRequest
0 голосов
/ 28 июня 2018

Этот вопрос относится к использованию декоратора @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

1 Ответ

0 голосов
/ 28 июня 2018

Я думаю, что вы подходите к этому неправильно. Если вам нужен атрибут c, который всегда является суммой a и b, то это тот атрибут , который должен быть свойством:

@property
def c(self):
    return self.a + self.b

и вам вообще не нужны свойства для a или b.

Это также решает проблему отсутствия возможности установки; если вы не определите установщик для c, он не может быть установлен напрямую.

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