Python中為什麼要用self?
阿新 • • 發佈:2018-12-18
參考文章:
self的含義與基本用法
Python中為什麼要使用self
注意到文章中的一句話,避免非限定呼叫造成的全域性變數。
舉個例子來談談我對這句話的理解:
class Father(): def __init__(self,name): self.name = name def selfDemo(self): print('I am Father, My name is %s_%s' % (self.name,self)) class Son1(Father): def selfDemo(self): print('I am Son1, My name is %s_%s' % (self.name,self)) class Son2(Father): def selfDemo(self): print('I am Son2, My name is %s_%s' % (self.name,self)) f1 = Father('Jack') f2 = Father('Peter') f1.selfDemo() Father.selfDemo(f1) f2.selfDemo() Father.selfDemo(f2) s1 = Son1('Jack Son',) s2 = Son2('Peter Son',) s1.selfDemo() s2.selfDemo() Father.selfDemo(s2) Son1.selfDemo(s2)
- 定義一個Father類,有一個name屬性,一個selfDemo方法
- 定義兩個子類,一個Son1,一個Son2,兩個子類重寫了seflDemo方法
其輸出如下:
I am Father, My name is Jack_<__main__.Father object at 0x000001DFB5396940> I am Father, My name is Jack_<__main__.Father object at 0x000001DFB5396940> I am Father, My name is Peter_<__main__.Father object at 0x000001DFB539F748> I am Father, My name is Peter_<__main__.Father object at 0x000001DFB539F748> I am Son1, My name is Jack Son_<__main__.Son1 object at 0x000001DFB539F828> I am Son2, My name is Peter Son_<__main__.Son2 object at 0x000001DFB539F860> I am Father, My name is Peter Son_<__main__.Son2 object at 0x000001DFB539F860> I am Son1, My name is Peter Son_<__main__.Son2 object at 0x000001DFB539F860>
從中可以看出:
- f1.selfDemo()與Father.selfDemo(f1)的呼叫方式是等價的。
- s1.selfDemo()與s2.selfDemo()的輸出符合預期。即使他們共用了父類的初始化函式,但是因為有self,他們仍然可以將各自的引數準確地傳遞到方法selfDemo()中。
- 這兩個語句(Father.selfDemo(s2),Son1.selfDemo(s2)),無論是其父類,還是其他類,都可以顯示呼叫例項。
所以的我self的作用有:
- 一個類模板可以建立許多個例項,也可以派生出許多子類,self保證了每個父類的例項或者子類的例項,可以各自呼叫自身的方法,而不會呼叫其他例項的方法。換句話說,類中的方法相當於一臺車,而宣告例項的過程中就把相當於把這臺車造出來,並且這個例項的地址(名字)就是這臺車的鑰匙,self就是那個預留的鑰匙孔
- 可以通過顯示呼叫,使得子類的例項可以呼叫其父類的方法,顯得靈活了許多。