2012-04-29 67 views
4

我是新來的Python編程,我有一類,這個類我創建一個對象(OBJ1)。我不希望比這個對象來創建其他的,如果任何機構想創造一個更對象爲這個類應僅引用第一個對象(而不是創建另一個對象)。如何執行此操作?請參考下面的代碼?如何避免在python中創建對象?

class MyClass: 
    def __init__(self): 
     pass 
obj1=MyClass()//create object 
obj2=MyClass()//avoid creation and refer obj2 to obj1 
obj3=MyClass()//avoid creation and refer obj3 to obj1 
+1

檢查這個答案http://stackoverflow.com/questions/6760685/creating-a-singleton在蟒蛇單身-in-蟒 – 2012-04-29 09:57:54

+0

可能重複[有一個簡單,優雅的方式在Python定義單身?](http://stackoverflow.com/questions/31875/is-there-a-simple-elegant-辦法對定義,單身式的Python) – 2012-04-29 10:50:02

+2

題外話,但Python中的註釋開始與有h字符(#)。 – martineau 2012-04-29 15:02:22

回答

7

所以你想要的東西單身十歲上下?然後根本不要使用對象。簡而言之功能在一個單獨的模塊(.py文件),並把你的變量在模塊範圍(例如全局變量) - 這就是做你想做什麼,如果你不需要線程安全的Python的方式。記住:這不是Java,所有的類都不是要走的路。

然而,這裏的一些代碼,允許只有一個實例:

class MyClass: 
    def __init__(self): 
     if getattr(self.__class__, '_has_instance', False): 
      raise RuntimeError('Cannot create another instance') 
     self.__class__._has_instance = True 

如果你想單身,看看Python and the Singleton PatternIs there a simple, elegant way to define singletons?

+4

在同樣左側的outlied對勾,雖然討論其他問題:Python是不是Java(http://dirtsimple.org/2004/12/python-is -not-java.html)。 – delnan 2012-04-29 09:12:11

+1

@delnan真棒。優秀評論 – 2012-04-29 10:48:31

+0

我的+1使用模塊而不是類。實際上創建了類和實例,以便能夠與模塊相比創建更多實例。 – pepr 2012-04-29 19:35:52

1

你可以創建一個對象,並使其成爲一個全球性的,即如果您正在編碼的模塊將使用單個文件,或者您可以將它放在單獨的模塊中並導入它,則模塊中的頂級對象將使用它。

+0

這不是解決方案。 Singleton模式的意思是,如果任何代碼(也就是不知道程序的其他部分)*創建另一個*單獨的對象,它實際上不共享任何其他特殊方式唯一的一個。共享單個對象的協議不會阻止其他代碼創建另一個實例。 – pepr 2012-04-29 19:33:53

3

這裏有一個簡單的方法 - 隱藏的類名:

class obj: 
    pass 

obj = obj() 

這將使class obj情況下更難以創造之後 - 但不是不可能的,因爲在評論中指出。

另一種選擇,刪除其類第一次使用後:

class MyClass: 
    def method(self): print 'spam' 

obj1 = MyClass() 
del MyClass 
obj1.method() # show instance still exists 
obj2 = MyClass() 

輸出:

spam 
Traceback (most recent call last): 
    File "noclass.py", line 7, in <module> 
    obj2 = MyClass() 
NameError: name 'MyClass' is not defined 
+3

'obj2 = type(obj)()'。實際上,在元編程代碼中,這樣的代碼會不時出於很好的理由而使用(並且沒有任何意圖)。 – delnan 2012-04-29 11:05:47

+0

是的,我在ORM代碼和Python到其他語言的界面中看到過這樣的瘋狂東西。 – 2012-05-03 02:24:09