2015-04-17 71 views
0

我用以下解決方案來維持類實例的列表:https://stackoverflow.com/a/12102163如何在Python中始終使用同一個類的實例?

現在我想使用該列表,以確保始終有類只有一個實例。對類的更新初始化應該返回一個現有的實例。

我的代碼是:

class MyClass: 

    instances = [] 

    def __init__(self): 
     if not MyClass.instances: 
      self.data=1234 
     else: 
      self = MyClass.instances[0] 

所以:

>> a=MyClass() 
>> a.data 
1234 

而B = MyClass的()應返回相同的實例作爲。這不起作用。我的代碼有什麼問題?

編輯:好吧,事實證明我正在尋找單身模式,但不能自己重新創建它。任何人都可以請解釋爲什麼我的代碼不起作用?

+2

相關:有沒有一種簡單,優雅的方式來定義在Python單身?](http://stackoverflow.com/questions/31875/is-there-a-simple-elegant-way-to- python) – jfs

+0

最後回答這個問題:你的代碼出了什麼問題,'self'只是'__init__'中的一個局部變量。賦值給它並不會改變調用返回到MySelf()的值。 –

+1

使用單身人士(特別是在Pythong中使用單身人士)最近似乎... _discouraged_ ...請參閱http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons和http:/ /stackoverflow.com/questions/1318406/why-is-the-borg-pattern-better-than-the-singleton-pattern-in-python – BorrajaX

回答

0

去你的代碼行和你的風格。您可以進行以下修改: -

class MyClass: 
    instance = None 
    def __init__(self): 
     self.data=1234 
     MyClass.instance = self 

def get_myclass(): 
    if MyClass.instance: 
     return MyClass.instance 
    return MyClass() 

get_myclass將創建類對象的包裝功能。嘗試代碼。

>>> import instance 
>>> a=instance.get_myclass() 
>>> b=instance.get_myclass() 
>>> a is b 
True 
+0

我有代碼調用'MyClass()',我不想改變'get_myclass'。有沒有辦法只使用'MyClass'? – boadescriptor

0

下面是一個Singleton元類配方的例子。這個例子來自Ch。 9的The Python Cookbook

class Singleton(type): 
    def __init__(self, *args, **kwargs): 
     self.__instance = None 
     super().__init__(*args, **kwargs) 

    def __call__(self, *args, **kwargs): 
     if self.__instance is None: 
      self.__instance = super().__call__(*args, **kwargs) 
      return self.__instance 
     else: 
      return self.__instance 

# Example 
class Spam(metaclass=Singleton): 
    def __init__(self): 
     print('Creating Spam') 


if __name__ == '__main__': 
    a = Spam() 
    b = Spam() 
    assert a is b 
相關問題