1. 程式人生 > >少說話多寫程式碼之Python學習040——類02(類的函式和方法 )

少說話多寫程式碼之Python學習040——類02(類的函式和方法 )

在類裡定義函式時的self引數,其實是方法和函式的區別。在類裡定義方法時,一般都在方法里加一個預設的引數,可以是,a,c,d的。但是約定俗成就統一叫self。self表示的是
這個類的當前例項,一個類有多個例項,那麼它屬於自己所屬於的例項,不會存在例項寧缺的self會指向例項陳皮皮。
這裡比價特別的是,可以把一個普通函式繫結到方法上使用,普通函式是沒有self的,看下面程式碼,

class myClass:
    def myMethod(self):
        print('這是我的一個方法,沒毛病')

def myMethod2():
    print('這不是我的一個方法,我也懵了...')

instance=myClass()
instance.myMethod()

instance.myMethod=myMethod2
instance.myMethod()

輸出

這是我的一個方法,沒毛病
這不是我的一個方法,我也懵了...

這裡的sefl引數不依賴於呼叫方法的方式。

class bird:
    song='快黃快割!'
    def sing(self):
        print(self.song)

abird= bird()
abird.sing()
birdsong=abird.sing
birdsong()

輸出

快黃快割!
快黃快割!

變數birdsong引用了繫結方法abird.sing上,訪問birdsong還是會對self引數進行訪問。

我們在學習類的時候,有一個概念,私有和公有。私有的元素(包括欄位,方法)只能在類的內部訪問,公有的元素才可以被其他類呼叫。一般一個類中如果提供給其他類訪問的屬性,
都會對該屬性提供get和set方法,通過他們修改自己的元素。
比如,

class Person:
    last_name='小白'
    def setName(self,value):
        self.last_name=value

    def getName(self):
        return  self.last_name

xiaoLi =Person()
print(xiaoLi.last_name)

#錯誤呼叫
xiaoLi.last_name='小李'
print(xiaoLi.getName())

#推薦呼叫
xiaoLi.setName('小李(正宗的)')
print(xiaoLi.getName())

輸出

小白
小李
小李(正宗的)

比如下面的方法,希望_inaccessible不能讓外面的類訪問到。如果外面的類訪問,我提供accessible給他們呼叫。那麼怎麼辦?

class Secretive:
    def _inaccessible(self):
        print('祕密,不能看')

    def accessible(self):
        print('祕密的內容是:')
        self._inaccessible()

s1= Secretive()
s1._inaccessible()
s1.accessible()

輸出

祕密,不能看
祕密的內容是:
祕密,不能看

其實只要將不想被別人訪問的方法置為私有即可,在Python中對方法前加兩個下劃線,就將方法置為私有了,如下面操作。

class Secretive2:
    def __inaccessible(self):
        print('祕密,不能看(我是私有方法啦)')

    def accessible(self):
        print('祕密的內容是:')
        self.__inaccessible()

s2= Secretive2()
#s2.__inaccessible()
s2.accessible()

這樣,如果訪問__inaccessible,會報如下異常。

Traceback (most recent call last):
  File "D:/work/Python/Class2.py", line 70, in <module>
    s2.__inaccessible()
AttributeError: 'Secretive2' object has no attribute '__inaccessible'

訪問accessible,可以正常輸出如下,

祕密的內容是:
祕密,不能看(我是私有方法啦)

工程檔案下載:https://download.csdn.net/download/yysyangyangyangshan/10777216