Python 進階_OOP 面向物件程式設計_self 的例項繫結
目錄
self 和繫結
在 Python 中 self 變數是特殊的, 其用於在例項方法中引用該方法所繫結的例項, 換句話說就是 Python 在例項化物件時會自動的將例項物件傳遞到類體的 self 變數中, 類體中的 self 變數代表了該類的例項物件. 例項方法無論在任何地方被呼叫, 例項物件總是作為第一個引數被傳遞進去, 從而實現了例項物件和例項方法的繫結, 這也是為什麼同一個類可以例項化多個不同的例項化物件的原因之一.
所以, 當我們定義類例項方法, 在方法宣告語句的引數列表中必須設定名為 self 的形參. 這也是類例項方法和常規方法最大的區別之一.
EXAMPLE
In [5]: class AClass(object):
...: def __init__(self, name):
...: self.name = name
...: def show_name(self):
...: print self.name
...:
In [6]: a_object = AClass('jmilkfan')
In [7]: a_object.show_name()
jmilkfan
呼叫非繫結的方法
那我們是不是不通過例項物件就一定沒辦法呼叫類例項方法了呢?
答案是否定的!
呼叫類例項方法的本質就是要傳遞一個例項物件到該方法中作為第一個實參. 我們在定義類例項方法的時候將 self 變數作為方法的第一個形參, 這樣做為我們帶來的好處在於, 我們通過例項物件去呼叫該類例項方法時, 不需要顯式的傳遞例項物件自身給 self 形參, 這一切都交由 Python 解析器去做. 相反, 如果我們希望不需要通過例項物件就能呼叫類例項方法, 那麼我們就顯式的將例項物件傳入吧.
呼叫非繫結方法最常間的場景就是, 我們在派生一個子類, 並且希望在子類中覆蓋父類的同名方法(過載).
EXSMPLE:
In [1]: class AClass(object) :
...: def __init__(self, name):
...: self.name = name
...:
In [3]: class BClass(AClass):
...: def __init__(self, age):
...: AClass.__init__(self, name)
...: self.age = age
...:
在這個例子中, 我們在子類的構造器中呼叫了父類的構造器, 並且顯式的傳遞了父類構造器所需要的 self 實參 __init__(self, name)
中, 所以我們可以通過類名結合句點識別符號的方式來呼叫父類的例項方法 AClass.__init__(self, name)
.
當然, 我們之前的博文中也介紹過這種時候我們建議通過 super()內建方法來實現.