tuple. В конструкторе также вычисляются другие поля bar/baz по foo. Легально ли так снаружи дергать foo.bar? То есть так можно поменять bar снаружи и не поменять foo, нарушив инвариант класса. Или лучше делать bar/baz псевдо-приватными через _ и делать computed property через @property bar? compute_bar/baz могут работать и быстро, но может там быть много зависимого кода, то есть при установке bar устанавливаться и baz
import time
from typing import Tuple
def compute_bar(foo: Tuple[int, int]):
time.sleep(42)
return foo[0]
def compute_baz(foo: Tuple[int, int]):
time.sleep(42)
return foo[1]
class Foo:
def __init__(self, foo: Tuple[int, int]):
self.foo = foo
self.bar = compute_bar(foo)
self.baz = compute_baz(foo)
foo = Foo()
bar = foo.bar
1. я бы разделил класс который занимается вычислениями и класс который тупо хранит данные 2. что есть "инвариант класса"? это вопрос не про терминологию, а про конкретный кейс 3. если у тебя там явно долгая работа бывает, я бы не делал проперти, а сделал метод, чтобы вызывающий его понимал, что хз когда оно завершится.
2. инвариант тут это то что поле foo - Tuple[int, int], а bar/baz всегда от него первый/последний intы. То есть когда меняется bar, должен поменяться и foo
Ну тогда можно и проперти без сеттера
то есть bar/baz сделать _bar/_baz, да?
спасибо
Обсуждают сегодня