Найти - Пользователи
Полная версия: возможно ли реализовать паттерн наблюдатель на низком уровне?
Начало » Python для новичков » возможно ли реализовать паттерн наблюдатель на низком уровне?
1
ks
>>> SETTINGS_STATE = method_updater()
>>> SETTINGS_STATE
False
>>> smth.set(True)
>>> SETTINGS_STATE
False
>>> method_updater()
True

Хочу чтобы переменная конфига сама за собой следила,
но пока не придумал, как.. м.б. это в принципе невозможно, в данном ключе сделать?
reclosedev
Если бы SETTING_STATE был в объекте, было бы проще.
config.SETTING_STATE
Но не до конца понятно, что хотите сделать. Что такое method_updater(), smth.set(True)?
Покажите лучше запускаемый пример и желаемый результат.
ks
method_updater() - это часть реализации паттерна “наблюдатель” - он возвращает текущее значение какого-то аттрибута класса.
Требуется придумать реализацию такой ссылки SETTINGS_STATE = method_updater(), которая бы вызывала сам метод, а не ссылалась на объект, им порождаемый.
Нужен сферический пример в вакууме, либо сказать, что это не возможно + пруфлинк. :)
reclosedev
ks
либо сказать, что это не возможно + пруфлинк.
невозможно
https://www.google.ru/search?&q=python+override+assignment
http://mail.python.org/pipermail/tutor/2006-September/049437.html

Но опять же, если допустима запись
config.SETTING_STATE = something
, тогда можно много чего натворить, хоть с property или дескрипторами, хоть с __setattr__/__getattr__.
GaiveR
Может я чего не понимаю, но что мешает делать:
SETTINGS_STATE = method_updater
# и потом:
SETTING_STATE()

?
ks
2GaiveR
Может я чего не понимаю, но что мешает делать:
SETTINGS_STATE = method_updater
# и потом:
SETTING_STATE()

?
Лишняя скобочка. Я получаю моральные страдания, используя её в такого типа значениях :D

2reclosedev
Но опять же, если допустима запись
config.SETTING_STATE = something
, тогда можно много чего натворить, хоть с property или дескрипторами, хоть с __setattr__/__getattr__.
Можно пример творения “много чего …, хоть с property или дескрипторами, хоть с __setattr__/__getattr__” ?
Или в худшем случае - где почитать.. слабенько получается вникнуть в эту концепцию, пока-что.
Мне про направление в сторону __getattr__ говорили, но идею не понял и по доке неосилил.
reclosedev
ks
Можно пример творения “много чего …, хоть с property или дескрипторами, хоть с __setattr__/__getattr__”
Еще раз прочитал сообщения и окончательно запутался. Совсем не понимаю чего вы хотите.
Что за “часть реализации паттерна “наблюдатель””, причем тут атрибуты класса (может объекта?). Что значит “следила за собой”.

ks
2GaiveR
Может я чего не понимаю, но что мешает делать:
SETTINGS_STATE = method_updater
# и потом:
SETTING_STATE()

?
Лишняя скобочка. Я получаю моральные страдания, используя её в такого типа значениях
Или нужно как раз это, только без “скобочек”?

Повторяю
reclosedev
Покажите лучше запускаемый пример и желаемый результат.

Единственная догадка - что нужен объект, на изменения атрибутов которого можно подписаться.
Готовая, мощная библиотека - http://code.enthought.com/projects/traits/examples.php
ks
reclosedev
Или нужно как раз это, только без “скобочек”?
Точно. Как раз это. Т.е. метод который постоянно возвращает необходимое значение у меня уже есть.
Но я хочу обращаться к нему, будто обращаюсь к RANDOM_CFG_VALUE
Наверное я изначально неправильно сформулировал.
reclosedev
ks
Наверное я изначально неправильно сформулировал.
Я и теперь не понял
Еще одна догадка:
class Config(object):
    def __init__(self, method):
        self._method = method
 
    @property
    def SETTING_STATE(self):
        return self._method()
     
class Foo(object):
    def __init__(self):
        self.bar = 1
     
    def method_updater(self):
        return self.bar
 
foo = Foo()
cfg = Config(foo.method_updater)
print cfg.SETTING_STATE  # 1
foo.bar += 1
print cfg.SETTING_STATE  # 2
ks
reclosedev
одна догадка
Бинго! Спасибо - это как раз то, что нужно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB