日常前言
哈哈哈,我猜你是被標題騙進來的!,但是我並不是標題黨,真真真的來用Python找個對象,只不過這個對象嘛,大家都懂的,當然是Class和self這兩個面向對象編程的東西,初學Python的時候學了一點,做了的筆記,敷衍了事,之後便再也沒用過了-_-!!
當後來建立博客網站的時候,1000多行代碼全部擠到一個文件、各種變量重名、各種bug,才知道Class的好處
- 由於Class之後會佔用一個縮進,所以結構清晰
- 獨有的self,讓局部變量被限制在當前的實例類中,不污染全局變量
- 通過繼承,可使代碼量大大減少
接下來,我會把我全部知道的關於面向對象編程的知識通過通俗易通的方式講述出來,請大家放心閱讀!
聲明:
碼代碼也有一年的多的時間了,由於是學生的關係,平時就用Python玩下爬蟲、樹莓派和維護自己博客,也沒做過什麼大的項目,所以代碼的結構寫的也是比較簡單,常用的也只是像def
、if/elif/else
、return
這樣的普通小函數。
如果處於是小白階段,不是非要寫什麼大的項目的話,其實Class這個函數真的真的真的不用看,也看不進去,比如我…目前所學的已經足夠使用了
基本結構
>>> class Messy:
def __init__(self):
self.test = '這是測試字符串!'
def testFun(self):
print(self.test)
>>> Messy().test_fun()
這是測試字符串!
Messy:
類名,大寫開頭命名
__init__:
一旦定義了,在執行類名的時候,如Messy()
,類名裏的__init__
也會一起執行
self:
類中的函數必須使用它作爲第一個參數
**注意:**在類裏面定義的變量名和函數名不能重名,不然衝突了會報錯!
self
到底是什麼?有什麼好處?
他是一個類對象,以字典形式存儲對象
>>> print(self.__dict__)
>>> {'testStr': '這是測試字符串!'}
__dict__:
查看當前類裏面的所有以self.*
命名的變量名和函數名(在類裏直接通過a=2
這樣形式賦值的不包含)
**他的好處:**作爲一個局部變量,當時是無法污染全局變量的啦
當然,如果學過前端的Js,應該知道this這個困擾廣大程序猿的函數,其實python的self就跟js的this很像,都是指向的當前實例。另外,Js中也有self函數,但是他指向的是窗口實例(window),如window.onload可替換爲self.onload。
繼承
>>> class One:
def __init__(self):
self.testStr = '這是測試字符串!'
def oneFun(self):
print(self.testStr)
>>> class Two:
def twoFun(self):
print('two')
>>> class Main(One,Two):
pass
>>> Main().oneFun()
>>> 這是測試字符串!
>>> Main().twoFun()
>>> two
上面的代碼是一個常規的繼承結構,可以通過class Main(繼承的類名,類名二)
來獲取之前定義好的函數,大大減少代碼量。下面
Main.__bases__ += (One,)
Main.oneFun()
Main.__bases__ += (A, B, ) # 多繼承直接在逗號後加入類名即可
繼承之後的重寫函數
在繼承了上個函數後,可能會遇到需要重構其中一個函數的情況,這個時候,直接def 需要重寫的函數名
即可,e.g:
>>> class Messy:
def __init__(self):
self.testStr = '這是測試字符串!'
def messy(self):
print(self.__dict__)
print(self.testStr)
>>> class MessyNew(Messy):
def messy(self):
print('asd')
>>> Messy().messy()
>>> 這是測試字符串!
>>> MessyNew().messy()
>>> asd
前後雙下劃線、前單下劃線、前雙下劃線分別代表什麼?
__Messy__:
定義的是特殊方法,一般是系統定義名字 ,類似 init() 之類的。
_Messy:
只允許自己和子對象訪問,如不能使用from test import Messy
__Messy:
只允許當前類訪問,外部訪問需要使用Test._Test__Messy
的方式