Python類呼叫例項方法

2021-09-25 02:10:43 字數 1507 閱讀 1548

前面講過,在 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...