Форум сайта python.su
искал способ сделать синглетон на питоне
нашел метод Борга:
__shared_state = {}
def __init__(self):
self.__dict__ = self.__shared_state
# that's all!
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
Отредактировано (Фев. 25, 2011 21:22:56)
Офлайн
смешно
Офлайн
>>> 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 попадают все данные класса?
self.__dict__ = self.__single
Офлайн
Игнатэто не совсем синглтон, экземпляры классов все же разные:
искал способ сделать синглетон на питоне
Офлайн
Ни разу подобный выкрутас не требовался
Офлайн
Я обычно использую такой код
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')
Офлайн