1. 程式人生 > >Python中為什麼要用self?

Python中為什麼要用self?

參考文章:
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>

從中可以看出:

  1. f1.selfDemo()與Father.selfDemo(f1)的呼叫方式是等價的。
  2. s1.selfDemo()與s2.selfDemo()的輸出符合預期。即使他們共用了父類的初始化函式,但是因為有self,他們仍然可以將各自的引數準確地傳遞到方法selfDemo()中。
  3. 這兩個語句(Father.selfDemo(s2),Son1.selfDemo(s2)),無論是其父類,還是其他類,都可以顯示呼叫例項。

所以的我self的作用有:

  1. 一個類模板可以建立許多個例項,也可以派生出許多子類,self保證了每個父類的例項或者子類的例項,可以各自呼叫自身的方法,而不會呼叫其他例項的方法。換句話說,類中的方法相當於一臺車,而宣告例項的過程中就把相當於把這臺車造出來,並且這個例項的地址(名字)就是這臺車的鑰匙,self就是那個預留的鑰匙孔
    。當然,這個例子舉得不是十分恰當,python中的類也是元類的例項,元類也是一個例項。
  2. 可以通過顯示呼叫,使得子類的例項可以呼叫其父類的方法,顯得靈活了許多。