Украшение свойств Python наблюдаемым шаблономPython

Программы на Python
Ответить
Anonymous
 Украшение свойств Python наблюдаемым шаблоном

Сообщение Anonymous »

Я пытаюсь создать наблюдаемый декоратор, который добавляет к свойству метод «add_observer».
Основная проблема, с которой я столкнулся, заключается в том, что я не знаю, как обращаться с методом получения. Было бы здорово, если бы я мог каким-то образом расширить базовое свойство с помощью метода.

Код: Выделить всё

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
Я не могу использовать opt.debug в качестве логического значения.
Я пробовал альтернативы, такие как изменение владельца с помощью Owner.add_observable(owner.debug, Lambda x: 'привет!') это очень близко к тому, что я хочу, но недостаточно близко. Главным образом потому, что я хотел, чтобы автозаполнение работало.
Кроме того, я получаю ошибку скрытия в IDE, которую @property не вызывает, почему?:
Изображение


Подробнее здесь: https://stackoverflow.com/questions/792 ... le-pattern
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»