Найти - Пользователи
Полная версия: Registry pattern
Начало » Python для экспертов » Registry pattern
1
nerezus
__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
classname - смахивает на ересь какую-то:) Обязательно делать Registry классом? Может сделать Registry инстансом класса и там всё необходимое реализовать как это и принято делать?
nerezus
Просто хочется, чтобы и такой синтаксис поддерживало.

> инстансом класса
А как он будет виден из модулей тогда в их глобальной области?)

В этом и прикол сабжа, что это хранилище, везде доступное.


http://framework.zend.com/manual/en/zend.registry.html
poltergeist
class _Registry(object):
...

Registry = _Registry()
Вот и всё:) Про __get__, __set__, __delete__ я вообще молчу, как вы вообще умудрились такое изобразить? Почему это всё должно работать? Удивительно:)
nerezus
Registry = _Registry()

Допустим я в другом файле его подключаю и делаю так же(пока опустим, что это лишняя строка).
Так и объект же другой будет, а надо тот же. Уж не синглетоном его же делать

P.S. Пройдите по ссылке выше, там про Zend_Registry написано
Evg
А проверку может можно сделать если объект есть то не создавать?
if not Registry:
Registry = _Registry()
nerezus
Его НЕЛЬЗЯ создавать повторно )
Можно обойти через синглтон, но некрасиво.

Ну код рабочий есть для Registry.attr. Просто хочется через синтаксис юзать.
poltergeist
Так не создавайте его повторно, он будет создан в единственном экземпляре в том же модуле, где и _Registry находится, а импортировать вы будете не класс (_Registry), а его инстанс (Registry), вот и вся разница.
nerezus У вас там многопоточное приложение или нет?
nerezus
> nerezus У вас там многопоточное приложение или нет?
Естественно.
Но я блокирую вне него, т.к. внутри непотокобезопасно.

А про экземпляр… прикольно )
dvs
nerezus
А про экземпляр… прикольно )
так это один из способов создания синглтона в питоне, который вам почему-то `некрасиво` =)

почему бы сразу не унаследоваться от dict?
class _Registry(dict):
...
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