少說話多寫程式碼之Python學習040——類02(類的函式和方法 )
阿新 • • 發佈:2018-11-11
在類裡定義函式時的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