2011-02-01 112 views
6

這段代碼是怎麼運行的?我不知道如何讓__slots__工作

class Foo(): 
    __slots__ = [] 
    def __init__(self): 
     self.should_not_work = "or does it?" 
     print "This code does not run,",self.should_not_work 

Foo() 

我想插槽做過限制。我正在運行Python 2.6.6。

回答

8

__slots__機制適用於新式類。你應該繼承object

類聲明更改爲

class Foo(object): 
    # etc... 
+1

太棒了!謝謝! – 2011-02-01 09:25:37

9

__slots__提供內存使用的小優化,因爲它可以防止__dict__被分配到存儲實例的屬性。如果您有大量實例,這可能會很有用。

您所談論的限制大多是其實施方式的意外副作用。特別是,如果您的類繼承自沒有__dict__(例如object)的基類並且即使不會在任何子類中分配__dict__,也會停止創建__dict__,除非它們也定義了__slots__。它並不是作爲一種安全機制,所以最好不要嘗試像這樣使用它。

所有舊式課程自動獲得__dict__,因此__slots__不起作用。如果你從object繼承,你會得到你正在尋找的效果,但基本上不要打擾__slots__,直到你知道你有數百萬的實例和內存是一個問題。

相關問題