Основная проблема, с которой я столкнулся, заключается в том, что я не знаю, как обращаться с методом получения. Было бы здорово, если бы я мог каким-то образом расширить базовое свойство с помощью метода.
Код: Выделить всё
class observable:
def __init__(self, fget):
self.observers = []
self.fget = fget
self.fset = None
self.name = fget.__name__
def add_observer(self, observer):
self.observers.append(observer)
def setter(self, fset):
self.fset = fset
return self
def __set__(self, obj, value) -> None:
if self.fset is None:
raise AttributeError(f"Setter not defined for property {self.name}")
self.fset(obj, value)
for observer in self.observers:
observer(value)
def __get__(self, obj, objtype=None):
return self
class Options:
def __init__(self):
self._debug: bool = False
@observable
def debug(self) -> bool:
return self._debug
@debug.setter
def debug(self, debug: bool):
self._debug = debug
opt = Options()
print(opt.debug)
opt.debug.add_observer(lambda value: print(f"Debug is {value}"))
opt.debug = True
opt.debug = False
Код: Выделить всё
Debug is True
Debug is False
Я пробовал альтернативы, такие как изменение владельца с помощью Owner.add_observable(owner.debug, Lambda x: 'привет!') это очень близко к тому, что я хочу, но недостаточно близко. Главным образом потому, что я хотел, чтобы автозаполнение работало.
Кроме того, я получаю ошибку скрытия в IDE, которую @property не вызывает, почему?:

Подробнее здесь: https://stackoverflow.com/questions/792 ... le-pattern
Мобильная версия