迷茫2017-04-17 16:27:00
staticmethod並不是因為不想創建實例才聲明的,而是聲明該方法不會更改實例本身的資料。
classmethod也不是因為不想創建實例才聲明的,而是為了實現對類別本身的操作(傳入cls之後就可以對自身的屬性和方法進行操作)。
只是個人淺薄的見解,供題主參考一下。
大家讲道理2017-04-17 16:27:00
直觀上看,classmethod和staticmethod的函數簽名不一樣,一個是有參的,一個是無參的。
都屬於python的裝飾器,注意在classmethod裡,參數不一定必須是cls,可以是任何被命名的變數。在不涉及到父子類別的時候,這2者行為看起來是一樣的,但如果設計到父子類別的時候,classmethod可以判斷出呼叫的子類別物件
# -*- coding: utf-8 -*-
class Parent(object):
@staticmethod
def staticSayHello():
print "Parent static"
@classmethod
def classSayHello(anything): #这里是anything
if anything == Boy:
print "Boy classSayHello"
elif anything == Girl:
print "girl sayHello"
class Boy(Parent):
pass
class Girl(Parent):
pass
if __name__ == '__main__':
Boy.classSayHello()
Girl.classSayHello()
PHP中文网2017-04-17 16:27:00
static 和 class 還有 普通的內部方法的區別除了用法上的細微差別 主要還是考慮到程式碼隔離上。 static 不需要任何類別和實例的資訊。 class 需要類別的資訊。 普通方法需要 instance 實例資訊。不用太在意這些細節。當你不明白的時候都寫成普通方法好了。當你感覺到有需要的時候就知道要改用哪一個了。
阿神2017-04-17 16:27:00
在一門物件導向物件語言中,static
通常表示被修飾的方法或變數不屬於實例,而是屬於類別。 static
通常意味着被修饰的方法或者变量不属于实例,而是属于类。
静态方法的作用在于:如何一个方法需要在不构造实例的情况下调用,那么这个方法就需要被定义成静态。静态方法不能被override
override
,也不具備大部分OO特性,靜態方法實際上存在過程式語言的想法。 根據自己寫Python程式碼的經驗,物件導向在Python中用起來有點生硬,像是static方法和函數不知道要選誰。所以,建議專注學習Python自己獨特的特性,而不是OO。 🎜