對於Python函式與方法,你可能存在些誤解

2021-09-26 02:48:51 字數 3114 閱讀 3137

很多童鞋會比較疑惑,在python中方法和函式有什麼區別,都是通過def去定義的啊?其實不然,今天我們就來分別介紹下兩者…

在學習之前先來看下面的一段**:

class yoo:

def hi(self):

print("guess it...")

上面的**,在正常執行的前提下,hi是方法還是函式,你們怎麼看?

型別判斷

如果我們想判斷乙個物件,是什麼型別,初學者都會使用type,而方法和函式,在type中已有定義,分別為methodtype,functiontype,按照上面所說,我們進行下判斷

# hi為方法

x = yoo()

isinstance(x.hi, methodtype) >>> true

# hi為函式

isinstance(yoo.hi, functiontype) >>> true

方法,是用來描述乙個物件的行為動作!

第一種方式是類的物件呼叫hi即為方法,第二種是類呼叫hi則為函式….

函式

關於python的函式,大體可分為內建函式、匿名函式、自定義函式….

方法

python的方法,就比較豐富了,你可以這麼劃分它:

今天重點跟大家對比下例項方法、類方法、靜態方法,讓我們來看一段**

class mainclass:

def shilifangfa(self):

print('這是乙個例項方法')

@classmethod

def leifangfa(cls):

print('這是乙個類方法')

@staticmethod

def jingtaifangfa():

print('這是乙個靜態方法')

m=mainclass()

m.shilifangfa()

m.leifangfa()

m.jingtaifangfa()

output:

這是乙個例項方法

這是乙個類方法

這是乙個靜態方法

好吧,先說下方法的分類吧:

例項方法

類方法靜態方法

可是,這三種方法有什麼區別呢,光看上面的這段**,沒有任何差異啊。

那麼我們把這段**稍作修改

class mainclass:

def shilifangfa(self):

print('這是乙個例項方法',self)

@classmethod

def leifangfa(cls):

print('這是乙個類方法',cls)

@staticmethod

def jingtaifangfa():

print('這是乙個靜態方法')

m=mainclass()

m.shilifangfa()

m.leifangfa()

m.jingtaifangfa()

output:

這是乙個例項方法 <__main__.mainclass object at 0x00000000012af0b8>

這是乙個類方法 這是乙個靜態方法

這次的輸出和上次相比,是否看到例項方法,我們需要傳給它乙個例項物件,而類方法我們需要傳給他的是乙個類

那麼如果我們給例項方法傳輸的不是乙個由類產生的例項會如何呢?

mainclass.shilifangfa()

typeerror: shilifangfa() missing 1 required positional argument: 『self』

報錯的意思很明顯,我們需要傳給他乙個例項的名稱,當然你也可以隨便寫乙個數值去傳遞,那麼也就沒有作為例項方法的意義了

說了例項方法,那麼類方法呢?同樣我們換一種方式去呼叫

mainclass.leifangfa()

這是乙個類方法

這次沒有任何變化,為什麼呢?

原因在於,當使用類方法時,傳遞的引數應該是乙個類名,但如果是例項,系統會自動找到例項對應的類名稱

仔細看看下面的**,你會對例項方法與類方法有更詳細的認識 

class mainclass:

a=100 # 方法本身的屬性

def shilifangfa(self):

print('這是乙個例項方法',self.a)

print(self.index) # 正常訪問

self.a=200 # 相當於例項本身建立了乙個屬性

print(self.a) # output a=200

print(mainclass.a) # output a=100

@classmethod

def leifangfa(cls):

print(cls.index) # type object 'mainclass' has no attribute 'index'

# 注意這句type object 它變相的告訴你,類也是乙個物件,只不過是乙個type的物件

# 這就更驗證了python中的那句,萬物皆物件

print('這是乙個類方法',cls.a)

cls.a = 200 # 修改了類本身的a

print(cls.a) # output a=200

print(mainclass.a) # output a=200

# print(cls.index) # 類方法無法獲取到例項的屬性

@staticmethod

def jingtaifangfa():

print('這是乙個靜態方法')

m=mainclass()

m.index=1000 # 例項本身的屬性

m.shilifangfa()

mainclass.leifangfa()

m.jingtaifangfa()

可重入函式與不可重入函式

可重入 reentrant 函式可以由多於乙個任務併發使用,而不必擔心資料錯誤。相反,不可重入 non reentrant 函式不能由超過乙個任務所共享,除非能確保函式的互斥 或者使用訊號量,或者在 的關鍵部分禁用中斷 可重入函式可以在任意時刻被中斷,稍後再繼續執行,不會丟失資料。可重入函式要麼使用...

可重入函式與不可重入函式

可重入 可重新進入,也即兩次進入的現場一模一樣?在實時系統的設計中,經常會出現多個任務呼叫同乙個函式的情況。如果這個函式不幸被設計成為不可重入的函式的話,那麼不同任務呼叫這個函式時可能修改其他任務呼叫這個函式的資料,從而導致不可預料的後果。那麼什麼是可重入函式呢?所謂可重入是指乙個可以被多個任務呼叫...

不可重入函式 與 可重入函式

不可重入函式不可以在它還沒有返回就再次被呼叫 該函式在被呼叫還沒有結束之前,再次被呼叫,從而可能產生錯誤。但是,可重入函式不存在這樣的問題。不可重入函式在實現時通常使用了全域性的資源 eg.全域性變數 在多執行緒的環境下,如果沒有很好的處理資料保護和互斥訪問,就可能會發生錯誤。常見的不可重入函式有 ...