2010-07-08 62 views
7

我是新來的Python,雖然單元測試我的對象上的一些方法,我注意到一些'怪異'。Python:調用方法'直接'實例化對象嗎?

class Ape(object): 
    def __init__(self): 
     print 'ooook' 

    def say(self, s): 
     print s 

def main(): 
    Ape().say('eeek') 

if __name__ == '__main__': 
    main() 

我寫了這個小例子來說明我困惑的地方。如果你做Ape()。say('eeek')這是否實際實例化一個Ape對象並運行init方法?我認爲它不會,但我有一些奇怪的副作用,所以現在我想它的確如此?

回答

10

是的。這就是Ape()所做的:它會創建一個新的Ape對象,並且作爲該過程的一部分,將運行__init__方法。

在您的示例中,您隨後調用該對象的say方法。請注意,如果您沒有Ape對象,則無法撥打say

+0

感謝掃清事情了。我猜Ape()會立即收集垃圾文件,因爲沒有任何地方提及它? – Pickels 2010-07-08 02:47:33

+1

@皮卡:它馬上變得無法訪問,所以它應該立即被垃圾收集,是的。或者它可能會停留在無法訪問的內存空間中,直到Python解釋器決定要回收空間爲止;-) – 2010-07-08 02:56:54

3

是的。 Ape()實例化類Ape的一個對象,但由於沒有賦值,所以沒有標籤與它關聯。此時它的__init__函數被調用。然後,調用say函數。

要明確:

Ape().say('eeek') 

等同於:

(Ape()).say('eeek') 

哪個更清楚地表示是第一次發生的事情。

12

如果您想直接調用方法而不創建實例,則可以使用裝飾器staticmethod。請注意,沒有self當你使用一個靜態方法

class Ape(object): 
    def __init__(self): 
     print 'ooook' 

    @staticmethod 
    def say(s): 
     print s 

def main(): 
    Ape.say('eeek') 

if __name__ == '__main__': 
    main() 

與類的方法進行比較,其中類是第一個參數,而不是一個實例

class Ape(object): 
    def __init__(self): 
     print 'ooook' 

    @classmethod 
    def say(cls, s): 
     print "the class is:", cls 
     print s 

def main(): 
    Ape.say('eeek') 

if __name__ == '__main__': 
    main() 
+0

謝謝,我真的很感激您提供的額外信息。 – Pickels 2010-07-08 06:54:46

+0

班級信息部分非常有用,謝謝。需要注意的一點是,init方法不會在兩者中運行,因爲它沒有實例化。 – ThinkBonobo 2017-08-30 20:00:24