2012-08-13 47 views
6

功能。如果我有幾個功能類:的Python:在一類和記憶

class Example: 

    def func1(self): 
     print 'Hi1' 
    def func2(self): 
     print 'Hi2' 
    def func3(self): 
     print 'Hi3' 

如果我創建「樣本」的幾個實例,確實每個實例存儲自己的職能副本中的類?還是Python有一個聰明的方法來存儲定義只有一次,並在每次實例使用類中的函數時查看它?

另外,靜態功能呢?這個類是否只保留每個靜態函數的一個副本?

+0

我不確定我是否理解這將暗示的性能差異。 – rsegal 2012-08-13 17:46:19

+0

即時通訊實例化數百萬個類的實例,所以我需要了解內存將如何受到影響。 – 2012-08-13 18:01:24

回答

12

實例化類時,不會創建新的函數對象,例如方法和靜態方法。當通過obj.func1訪問實例方法時,會創建一個名爲「綁定方法」的新包裝對象,該對象只會根據需要保留。包裝器對象是輕量級的,基本上包含一個指向底層函數對象和實例的指針(當調用函數時,該參數作爲self參數傳遞)。

請注意,使用staticmethod在Python中幾乎總是出錯。它的存在歸因於歷史的錯誤。如果您認爲需要靜態方法,通常需要模塊級功能。

+0

很好地說和易於理解 - 有關靜態方法的好注意 – 2012-08-13 17:53:18

+0

還要注意,函數對象本身可以(並且確實)共享字節碼,並且IIRC只添加一些元數據(名稱,模塊,docstring,捕獲變量等)那。 – delnan 2012-08-13 18:13:13

+0

@delnan:這隻適用於* local *函數,即函數內定義的函數。類體只執行一次,對於類體中的函數,函數對象和代碼對象之間存在一一對應關係。 – 2012-08-13 18:26:49

0

函數在類中「存儲」,包括靜態和非靜態。