2010-08-17 40 views
3

作爲這個星球上最糟糕的OOP程序員之一,我一直在閱讀大量的示例代碼,以幫助「獲得」什麼類可以用於。最近我發現這個例子:在類調用和方法調用之間,Python有什麼區別?

class NextClass:       # define class 
    def printer(self, text):    # define method 
     self.message = text     # change instance 
     print self.message     # access instance 

x = NextClass()        # make instance 

x.printer('instance call')    # call its method 

print x.message        # instance changed 

NextClass.printer(x, 'class call')  # direct class call 

print x.message        # instance changed again 

它沒有出現直接類的調用和實例調用之間有什麼區別;但它違背了禪宗,包括沒有一些使用他們的功能。所以如果有區別,它是什麼?性能?架空減少?也許可讀性?

回答

2

沒有區別。 instance.method(...)class.method(instance, ...)。但是,這並不違背了禪宗,因爲它說(重點煤礦):

應該有one--,最好只有一個 - 明顯做到這一點的方式。

第二種方式是可能的,每個熟悉Python的人都應該知道(以及爲什麼),但這是不明顯的方式,沒有人在真正的代碼中做這件事。

那麼爲什麼這樣呢?這就是方法在任何語言中的工作方式 - 一種方法是對一個對象/實例(可能還有更多參數)進行操作的代碼。除通常情況下,實例是隱式提供的(例如,C++/Java/D中的this) - 但是由於禪說「顯式比隱式更好」,自我明確地是每種方法的參數,這是不可避免的。明確禁止它是毫無意義的。除此之外,方法沒有被強迫(隱式地)接受一個實例的事實允許定義類方法和靜態方法,而不需要對語言進行特殊處理 - 第一種方法只是一種期望類的一個實例,而後者只是一種根本不期待實例的方法。

+0

難以置信的解釋delnan,你似乎總能爲我清除這些東西! – yrsnkd 2010-08-17 14:50:26

+0

(A ==比較也聲明你的核心。) – yrsnkd 2010-08-17 14:51:49

1

在這種情況下,沒有區別。在這兩個調用中,您正在提供該類的一個實例:

x.printer('instance call') # you supplied x and then called its printer method 
NextClass.printer(x, 'class call') # you supplied x as a parameter this time 

但是,通常情況下,我不會經常寫第二種方法。我通常會想到作爲實例方法在實例上運行的任何方法。事情是這樣:

car.drive('place') 
car.refuel 
car.impound 

而且,我用類方法來更一般工作(我掙扎來形容此):

Car.numberintheworld # returns the number of cars in the world (or your program) 

Here's一些more help,您的閱讀。

0

這可能會給你一個更好的解釋。

當一個實例屬性是 引用這不是一個數據 屬性,搜索它的類。如果 名稱表示一個有效的類 屬性,它是一個功能對象,是由包裝 (指針)的實例對象和 創建 方法對象的函數對象剛發現 一起在一個抽象的對象(即,該 方法目的)。當該方法 對象被調用的自變量 列表,新的參數列表是從實例對象 和參數列表構造 ,並且 功能對象被稱爲與該 新的參數列表。

相關問題