Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 25, 2011 21:21:03

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

не понимаю метод Борга

искал способ сделать синглетон на питоне

нашел метод Борга:

__shared_state = {}
def __init__(self):
self.__dict__ = self.__shared_state
# that's all!
http://www.internet-technologies.ru/articles/article_780.html

работает отлично - где бы я не создал объект - в нем всегда сохраняется состояние
таким образом допустим класс для работы с сетью - доступен во всех других классах с его индивидуальными настройками - достаточно лишь содать его объект: http = Http()

но я не понимаю как это все работает

вот мой код:
class Http():
__single = {}
url = ''

def __init__(self):
self.__dict__ = self.__single

def load(self):
print('http load url ' + self.url)

class Ac():

def test(self):
http = Http()
http.load()

http = Http()
http.url = 'google.ru'

ac = Ac()
ac.test() # выводит http load url google.ru
1 создаем один объект
2 к примеру, меняем его url
3 создаем второй объект внутри Ac.test()
при этом init берет self.__single, который у нового объекта должен быть пуст - и помещает его в self.__dict__ - тоже делая его пустым!

как тогда сохраняются данные класса Http?



Отредактировано (Фев. 25, 2011 21:22:56)

Офлайн

#2 Фев. 25, 2011 21:44:36

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

не понимаю метод Борга

смешно



Офлайн

#3 Фев. 25, 2011 22:39:28

ReinRaus
От:
Зарегистрирован: 2008-10-24
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

не понимаю метод Борга

>>> class test(object):
... p={}
... q=5
...
>>> x=test()
>>> x.p[1]=2
>>> y=test()
>>> print x.p, x.q
{1: 2} 5
>>> print y.p, y.q
{1: 2} 5
>>> x.q=6
>>> print x.q, y.q
6 5
>>> print test.p
{1: 2}
>>> test.p[2]=4
>>> print test.p, x.p, y.p
{1: 2, 2: 4} {1: 2, 2: 4} {1: 2, 2: 4}
>>> test.p=0
>>> print test.p, x.p, y.p
0 0 0
>>> x.p=1
>>> print test.p, x.p, y.p
0 1 0
>>>
данные сохраняются за счет кортежей и списков являющихся переменными класса, а не экземпляра.



Офлайн

#4 Фев. 25, 2011 23:00:57

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

не понимаю метод Борга

Да, и конечно же в питоне синглтоны это модули, и не надо ничего изобретать.



Офлайн

#5 Фев. 26, 2011 06:08:00

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

не понимаю метод Борга

данные сохраняются за счет кортежей и списков являющихся переменными класса, а не экземпляра.
однако, если создать экземпляр класса внутри другого класса - у него нет ни одного свойства, заданного классу ранее

и мне всё равно непонятно, как в переменную __single попадают все данные класса?



Офлайн

#6 Фев. 26, 2011 12:06:35

neol
От:
Зарегистрирован: 2009-09-20
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

не понимаю метод Борга

Игнат
и мне всё равно непонятно, как в переменную __single попадают все данные класса?
Насколько я понимаю, после выполнения
self.__dict__ = self.__single
self.__dict__ становится ссылкой на self.__single, а не его копией. В __dict__ записываются все атрибуты объекта (это описано в документации), а так как это ссылка, то они попадают в self.__single



Офлайн

#7 Фев. 26, 2011 14:11:25

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

не понимаю метод Борга

Игнат
искал способ сделать синглетон на питоне
это не совсем синглтон, экземпляры классов все же разные:
print id( Http() ), id( Http() )
но для работы достаточно.

вот пример синглтона, используется один и тот же экземпляр

Офлайн

#8 Фев. 26, 2011 14:16:28

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

не понимаю метод Борга

Ни разу подобный выкрутас не требовался



Офлайн

#9 Фев. 26, 2011 22:01:05

zheromo
От:
Зарегистрирован: 2010-10-02
Сообщения: 356
Репутация: +  2  -
Профиль   Отправить e-mail  

не понимаю метод Борга

Я обычно использую такой код

class Singleton(type):
''' Singleton metaclass. Use by defining the metaclass of a class Singleton,
e.g.: class ThereCanBeOnlyOne:
__metaclass__ = Singleton
'''

def __call__(mcs, *args, **kwargs):
if not mcs.has_instance():
mcs.instance = super(Singleton, mcs).__call__(*args, **kwargs)
return mcs.instance

def delete_instance(mcs):
''' Delete the (only) instance. This method is mainly for unittests so
they can start with a clean slate. '''
if mcs.has_instance():
del mcs.instance

def has_instance(mcs):
''' Has the (only) instance been created already? '''
return hasattr(mcs, 'instance')



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version