和類屬性可細分為類屬性和例項屬性一樣,類中的方法也可以有更細緻的劃分,具體可分為類方法、例項方法和靜態方法,本節將詳細介紹這 3 種類方法的特點和用法。
通常情況下,在類中定義的方法預設都是例項方法。前面章節中,我們已經定義了不只乙個例項方法。不僅如此,類的構造方法理論上也屬於例項方法,只不過它比較特殊。
例如:
class person :
#類構造方法,也屬於例項方法
def __init__(self, name = 'charlie', age=8):
self.name = name
self.age = age
# 下面定義了乙個say例項方法
def say(self, content):
print(content)
例項方法最大的特點就是,它最少也要包含乙個 self 引數,用於繫結呼叫此方法的例項物件。例項方法通常會用類物件直接呼叫,當然也可以用類名呼叫,例如:
#建立乙個類物件
person = person()
#類物件呼叫例項方法
person.say("類物件呼叫例項方法")
#類名呼叫例項方法,需手動給 self 引數傳值
person.say(person,"類名呼叫例項方法")
執行結果:
類物件呼叫例項方法
類名呼叫例項方法
python 類方法和例項方法相似,它最少也要包含乙個引數,只不過,類方法中通常將其命名為 cls,且 python 會自動將類本身繫結給 cls 引數(而不是類物件)。因此,在呼叫類方法時,無需顯式為 cls 引數傳參。
和 self 一樣,cls 引數的命名也不是規定的(可以隨意命名),只是 python 程式設計師約定俗稱的習慣而已。
除此之外,和例項方法最大的不同在於,類方法需要使用@classmethod
進行修飾,例如:
class bird:
# classmethod修飾的方法是類方法
@classmethod
def fly (cls):
print('類方法fly: ', cls)
注意,如果沒有 @classmethod,則 python 直譯器會將 fly() 方法認定為例項方法,而不是類方法。
類方法推薦使用類名直接呼叫,當然也可以使用例項物件來呼叫(不推薦),例如:
# 呼叫類方法,bird類會自動繫結到第乙個引數
bird.fly() #①
b = bird()
# 使用物件呼叫fly()類方法,其實依然還是使用類呼叫,
# 因此第乙個引數依然被自動繫結到bird類
b.fly() #②
執行結果為:
類方法fly: 類方法fly:
可以看到,不管程式是使用類還是物件呼叫類方法,python 都會將類方法的第乙個引數繫結到類本身。
靜態方法,其實就是我們學過的函式,和函式唯一的區別是,靜態方法定義在類這個空間(類命名空間)中,而函式則定義在程式所在的空間(全域性命名空間)中。
靜態方法沒有類似 self、cls 這樣的特殊引數,因此 python 直譯器不會對它包含的引數做任何類或物件的繫結,也正是因為如此,此方法中無法呼叫任何類和物件的屬性和方法,靜態方法其實和類的關係不大。
靜態方法需要使用@staticmethod
修飾,例如:
class bird:
# staticmethod修飾的方法是靜態方法
@staticmethod
def info (p):
print('靜態方法info: ', p)
靜態方法的呼叫,既可以使用類名,也可以使用類物件,例如:
#類名直接呼叫靜態方法
bird.info("類名")
#類物件呼叫靜態方法
b = bird()
b.info("類物件")
執行結果為:
靜態方法info: 類名
靜態方法info: 類物件
在使用 python 程式設計時,一般不需要使用類方法或靜態方法,程式完全可以使用函式來代替類方法或靜態方法。但是在特殊的場景(比如使用工廠模式)下,類方法或靜態方法也是不錯的選擇。至於靜態方法和類方法的具體應用場景,後續章節用到時再做詳細介紹。 python 類方法 靜態方法和例項方法
寫的時候感覺怪怪的,後面發現是類名首字母沒有大寫,不改了,請見諒 對python中的類來說,可以有類方法,靜態方法,例項方法三種方法。這三種方法裡面,例項方法應該是大家最熟悉的一種方法。其標誌就是方法的第乙個引數為self,通過類的例項來呼叫,呼叫時會預設將例項物件作為self引數傳入。當然也可以通...
靜態方法和例項方法
靜態方法 靜態方法是不屬於特定物件的方法,靜態方法可以訪問靜態成員變數,靜態方法不可以直接訪問例項變數,可以在例項函式呼叫的情況下,例項變數做為引數傳給靜態方法。靜態方法也不能直接呼叫例項方法,可以間接呼叫,首先要建立乙個類的例項,然後通過這一特定物件來呼叫靜態方法。例項方法 乙個例項方法的執行與特...
python 例項方法 靜態方法和類方法區別
一 python 類語法中有三種方法,例項方法,靜態方法,類方法 python中self,cls的區別 普通例項方法,第乙個引數需要是self,它表示乙個具體的例項本身。如果用了staticmethod,那麼就可以無視這個self,而將這個方法當成乙個普通的函式使用。而對於classmethod,它...