日常前言
哈哈哈,我猜你是被標題騙進來的!,但是我并不是標題黨,真真真的來用Python找個對象,只不過這個對象嘛,大家都懂的,當然是Class和self這兩個面向?qū)ο缶幊?/strong>的東西,初學Python的時候?qū)W了一點,做了的筆記,敷衍了事,之后便再也沒用過了-_-!!
當后來建立博客網(wǎng)站的時候,1000多行代碼全部擠到一個文件、各種變量重名、各種bug,才知道Class的好處
- 由于Class之后會占用一個縮進,所以結(jié)構(gòu)清晰
- 獨有的self,讓局部變量被限制在當前的實例類中,不污染全局變量
- 通過繼承,可使代碼量大大減少
接下來,我會把我全部知道的關(guān)于面向?qū)ο缶幊痰闹R通過通俗易通的方式講述出來,請大家放心閱讀!
聲明:
碼代碼也有一年的多的時間了,由于是學生的關(guān)系,平時就用Python玩下爬蟲、樹莓派和維護自己博客,也沒做過什么大的項目,所以代碼的結(jié)構(gòu)寫的也是比較簡單,常用的也只是像def
、if/elif/else
、return
這樣的普通小函數(shù)。
如果處于是小白階段,不是非要寫什么大的項目的話,其實Class這個函數(shù)真的真的真的不用看,也看不進去,比如我......目前所學的已經(jīng)足夠使用了
基本結(jié)構(gòu)
>>> class Messy:
def __init__(self):
self.test = '這是測試字符串!'
def testFun(self):
print(self.test)
>>> Messy().test_fun()
這是測試字符串!
Messy:
類名,大寫開頭命名
__init__:
一旦定義了,在執(zhí)行類名的時候,如Messy()
,類名里的__init__
也會一起執(zhí)行
self:
類中的函數(shù)必須使用它作為第一個參數(shù)
注意:在類里面定義的變量名和函數(shù)名不能重名,不然沖突了會報錯!
self
到底是什么?有什么好處?
他是一個類對象,以字典形式存儲對象
>>> print(self.__dict__)
>>> {'testStr': '這是測試字符串!'}
__dict__:
查看當前類里面的所有以self.*
命名的變量名和函數(shù)名(在類里直接通過a=2
這樣形式賦值的不包含)
他的好處:作為一個局部變量,當時是無法污染全局變量的啦
當然,如果學過前端的Js,應(yīng)該知道this這個困擾廣大程序猿的函數(shù),其實python的self就跟js的this很像,都是指向的當前實例。另外,Js中也有self函數(shù),但是他指向的是窗口實例(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
上面的代碼是一個常規(guī)的繼承結(jié)構(gòu),可以通過class Main(繼承的類名,類名二)
來獲取之前定義好的函數(shù),大大減少代碼量。下面
Main.__bases__ += (One,)
Main.oneFun()
Main.__bases__ += (A, B, ) # 多繼承直接在逗號后加入類名即可
繼承之后的重寫函數(shù)
在繼承了上個函數(shù)后,可能會遇到需要重構(gòu)其中一個函數(shù)的情況,這個時候,直接def 需要重寫的函數(shù)名
即可,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__:
定義的是特殊方法,一般是系統(tǒng)定義名字 ,類似 init() 之類的。
_Messy:
只允許自己和子對象訪問,如不能使用from test import Messy
__Messy:
只允許當前類訪問,外部訪問需要使用Test._Test__Messy
的方式
本文作者: Messy
原文鏈接:https://www.messys.top/detail/26
版權(quán)聲明: 本博客所有文章除特別聲明外, 均采用 CC BY-NC-SA 4.0 許可協(xié)議. 轉(zhuǎn)載請注明出處!