沒事干?要不用Python找個對象

日常前言

哈哈哈,我猜你是被標題騙進來的!,但是我并不是標題黨,真真真的來用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)寫的也是比較簡單,常用的也只是像defif/elif/elsereturn這樣的普通小函數(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)載請注明出處!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 包(lib)、模塊(module) 在Python中,存在包和模塊兩個常見概念。 模塊:編寫Python代碼的py...
    清清子衿木子水心閱讀 3,833評論 0 27
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,803評論 0 10
  • 初識面向?qū)ο?楔子 你現(xiàn)在是一家游戲公司的開發(fā)人員,現(xiàn)在需要你開發(fā)一款叫做<人狗大戰(zhàn)>的游戲,你就思考呀,人狗作戰(zhàn)...
    go以恒閱讀 945評論 0 6
  • 1. “你真要走?” “票都買好了,當然是真的。” 小主人提著我們的午飯過來,分在三個圈里的孩子們興奮起來,都擠到...
    葉人兒閱讀 1,149評論 14 23
  • 冬日暖陽(原創(chuàng)) □ 文/徐興映(云南) 讓 郁悶的心情 殺殺菌 消消毒 換件衣裳 就是春的伴娘
    小草心語閱讀 249評論 0 8