Найти - Пользователи
Полная версия: не понимаю метод Борга
Начало » Python для новичков » не понимаю метод Борга
1
Игнат
искал способ сделать синглетон на питоне

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

__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?
Андрей Светлов
смешно
ReinRaus
>>> 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
>>>
данные сохраняются за счет кортежей и списков являющихся переменными класса, а не экземпляра.
Александр Кошелев
Да, и конечно же в питоне синглтоны это модули, и не надо ничего изобретать.
Игнат
данные сохраняются за счет кортежей и списков являющихся переменными класса, а не экземпляра.
однако, если создать экземпляр класса внутри другого класса - у него нет ни одного свойства, заданного классу ранее

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

вот пример синглтона, используется один и тот же экземпляр
Андрей Светлов
Ни разу подобный выкрутас не требовался
zheromo
Я обычно использую такой код

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')
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