前面講過,在 python 的類體中定義的方法預設都是例項方法,也示範了通過物件來呼叫例項方法。
# 定義全域性空間的foo函式 def foo (): print("全域性空間的foo方法") # 全域性空間的bar變數 bar = 20 class bird: # 定義bird空間的foo函式 def foo(): print("bird空間的foo方法") # 定義bird空間的bar變數 bar = 200 # 呼叫全域性空間的函式和變數 foo() print(bar) # 呼叫bird空間的函式和變數 bird.foo() print(bird.bar)上面**在全域性空間和 bird 類(bird 空間)中分別定義了 foo() 函式和 bar 變數,從定義它們的**來看,幾乎沒有任何區別,只是在 bird 類中定義它們時需要縮排。
接下來程式在呼叫 bird 空間內的 bar 變數和 foo() 函式(方法)時,只要新增 bird. 字首即可,這說明完全可以通過 bird 類來呼叫 foo() 函式(方法)。這就是類呼叫例項方法的證明。
現在問題來了,如果使用類呼叫例項方法,那麼該方法的第乙個引數(self)怎麼自動繫結呢?例如如下程式:
class user: def walk (self): print(self, '正在慢慢地走') # 通過類呼叫例項方法 user.walk()執行上面**,程式會報出如下錯誤:
typeerror: walk() missing 1 required positional argument:'self'
請看程式最後一行**,呼叫 walk() 方法缺少傳入的 self 引數,所以導致程式出錯。這說明在使用類呼叫例項方法時,python 不會自動為第乙個引數繫結呼叫者。實際上也沒法自動繫結,因此例項方法的呼叫者是類本身,而不是物件。
如果程式依然希望使用類來呼叫例項方法,則必須手動為方法的第乙個引數傳入引數值。例如,將上面的粗體字**改為如下形式:
u = user() # 顯式為方法的第乙個引數繫結引數值 user.walk(u)此**顯式地為 walk() 方法的第乙個引數繫結了引數值,這樣的呼叫效果完全等同於執行 u.walk()。
實際上,當通過 user 類呼叫 walk() 例項方法時,python 只要求手動為第乙個引數繫結引數值,並不要求必須繫結 user 物件,因此也可使用如下**進行呼叫:
# 顯式為方法的第乙個引數繫結fkit字串引數值 user.walk('fkit')如果按上面方式進行繫結,那麼 'fkit' 字串就會被傳給 walk() 方法的第乙個引數 self。因此,執行上面**,將會看到如下輸出結果:
fkit 正在慢慢地走
python 的類可以呼叫例項方法,但使用類呼叫例項方法時,python 不會自動為方法的第乙個引數 self 繫結引數值;程式必須顯式地為第乙個引數 self 傳入方法呼叫者。這種呼叫方式被稱為「未繫結方法」。
推薦學習路線python類呼叫例項方法
python 類和例項呼叫
self指向的是例項物件,作為第乙個引數,使用時不需要傳入此引數。class student object 定義乙個student類,def init self,name,score,age self.name name self.score score self.age age defprint ...
Python 類方法,例項方法,類變數,例項變數
建立乙個person類 class person object per v per v 建立乙個類變數 def init self,name,age 初始化類例項變數 self.name name self.age age definstance method self 建立類例項方法 print ...
python中子類例項化呼叫父類方法
物件導向的核心為物件,物件是由類例項化而來的,那麼類與類之間存在乙個繼承的關係,被繼承的類叫做父類,繼承了父類的類為子類。子類繼承了父類,那麼子類例項化的物件就可以呼叫所有父類的方法,當然也可以呼叫子類自身所有的方法。因為這些方法都屬於該物件的方法。比如,子類child繼承了父類father chi...