nerezus
Авг. 24, 2009 22:40:46
__get__ и __set__ для classname.attr синтаксиса.
А как юзать classname синтаксис? Такой надо бы сделать (
class Registry(object):
data = {}
@staticmethod
def __set__(variable, value):
Registry.data[variable] = value
@staticmethod
def __setitem__(variable, value):
Registry.data[variable] = value
@staticmethod
def __get__(variable):
return Registry.data[variable]
@staticmethod
def __getitem__(variable):
return Registry.data[variable]
@staticmethod
def __delete__(variavle):
del(Registry.data[variable])
Registry.e = 12
print Registry.e
Registry['e'] = 34
print Registry['e']
Вопрос: почему 2 последние строки не пашут?
poltergeist
Авг. 24, 2009 23:00:51
classname - смахивает на ересь какую-то:) Обязательно делать Registry классом? Может сделать Registry инстансом класса и там всё необходимое реализовать как это и принято делать?
nerezus
Авг. 24, 2009 23:05:57
Просто хочется, чтобы и такой синтаксис поддерживало.
> инстансом класса
А как он будет виден из модулей тогда в их глобальной области?)
В этом и прикол сабжа, что это хранилище, везде доступное.
http://framework.zend.com/manual/en/zend.registry.html
poltergeist
Авг. 24, 2009 23:17:04
class _Registry(object):
...
Registry = _Registry()
Вот и всё:) Про __get__, __set__, __delete__ я вообще молчу, как вы вообще умудрились такое изобразить? Почему это всё должно работать? Удивительно:)
nerezus
Авг. 24, 2009 23:27:37
Registry = _Registry()
Допустим я в другом файле его подключаю и делаю так же(пока опустим, что это лишняя строка).
Так и объект же другой будет, а надо тот же. Уж не синглетоном его же делать
P.S. Пройдите по ссылке выше, там про Zend_Registry написано
Evg
Авг. 24, 2009 23:44:10
А проверку может можно сделать если объект есть то не создавать?
if not Registry:
Registry = _Registry()
nerezus
Авг. 25, 2009 00:48:53
Его НЕЛЬЗЯ создавать повторно )
Можно обойти через синглтон, но некрасиво.
Ну код рабочий есть для Registry.attr. Просто хочется через синтаксис юзать.
poltergeist
Авг. 25, 2009 08:13:16
Так не создавайте его повторно, он будет создан в единственном экземпляре в том же модуле, где и _Registry находится, а импортировать вы будете не класс (_Registry), а его инстанс (Registry), вот и вся разница.
nerezus У вас там многопоточное приложение или нет?
nerezus
Авг. 26, 2009 00:46:45
> nerezus У вас там многопоточное приложение или нет?
Естественно.
Но я блокирую вне него, т.к. внутри непотокобезопасно.
А про экземпляр… прикольно )
dvs
Окт. 29, 2009 20:33:07
nerezus
А про экземпляр… прикольно )
так это один из способов создания синглтона в питоне, который вам почему-то `некрасиво` =)
почему бы сразу не унаследоваться от dict?
class _Registry(dict):
...