Python例項方法 靜態方法和類方法

2021-09-26 15:19:47 字數 2239 閱讀 6360

和類屬性可細分為類屬性和例項屬性一樣,類中的方法也可以有更細緻的劃分,具體可分為類方法、例項方法和靜態方法,本節將詳細介紹這 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,它...