Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 24, 2009 22:40:46

nerezus
От:
Зарегистрирован: 2006-08-01
Сообщения: 178
Репутация: +  0  -
Профиль   Отправить e-mail  

Registry pattern

__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 последние строки не пашут?



Отредактировано (Авг. 24, 2009 22:57:50)

Офлайн

#2 Авг. 24, 2009 23:00:51

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Registry pattern

classname - смахивает на ересь какую-то:) Обязательно делать Registry классом? Может сделать Registry инстансом класса и там всё необходимое реализовать как это и принято делать?



Офлайн

#3 Авг. 24, 2009 23:05:57

nerezus
От:
Зарегистрирован: 2006-08-01
Сообщения: 178
Репутация: +  0  -
Профиль   Отправить e-mail  

Registry pattern

Просто хочется, чтобы и такой синтаксис поддерживало.

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

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


http://framework.zend.com/manual/en/zend.registry.html



Офлайн

#4 Авг. 24, 2009 23:17:04

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Registry pattern

class _Registry(object):
...

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



Офлайн

#5 Авг. 24, 2009 23:27:37

nerezus
От:
Зарегистрирован: 2006-08-01
Сообщения: 178
Репутация: +  0  -
Профиль   Отправить e-mail  

Registry pattern

Registry = _Registry()

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

P.S. Пройдите по ссылке выше, там про Zend_Registry написано



Офлайн

#6 Авг. 24, 2009 23:44:10

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

Registry pattern

А проверку может можно сделать если объект есть то не создавать?
if not Registry:
Registry = _Registry()



Офлайн

#7 Авг. 25, 2009 00:48:53

nerezus
От:
Зарегистрирован: 2006-08-01
Сообщения: 178
Репутация: +  0  -
Профиль   Отправить e-mail  

Registry pattern

Его НЕЛЬЗЯ создавать повторно )
Можно обойти через синглтон, но некрасиво.

Ну код рабочий есть для Registry.attr. Просто хочется через синтаксис юзать.



Офлайн

#8 Авг. 25, 2009 08:13:16

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Registry pattern

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



Отредактировано (Авг. 25, 2009 08:14:47)

Офлайн

#9 Авг. 26, 2009 00:46:45

nerezus
От:
Зарегистрирован: 2006-08-01
Сообщения: 178
Репутация: +  0  -
Профиль   Отправить e-mail  

Registry pattern

> nerezus У вас там многопоточное приложение или нет?
Естественно.
Но я блокирую вне него, т.к. внутри непотокобезопасно.

А про экземпляр… прикольно )



Офлайн

#10 Окт. 29, 2009 20:33:07

dvs
От:
Зарегистрирован: 2006-05-22
Сообщения: 176
Репутация: +  3  -
Профиль   Отправить e-mail  

Registry pattern

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

почему бы сразу не унаследоваться от dict?
class _Registry(dict):
...



Отредактировано (Окт. 29, 2009 20:33:30)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version