聚沙成塔--爬蟲系列(八)(物以「類」聚,人以群分)

版權聲明:本文為作者原創(chuàng)文章薄翅,可以隨意轉載沙兰,但必須在明確位置標明出處Cツ巍!鼎天!

文章講到這里舀奶,我不得不想先把面向對象的編程講了,否則我們的代碼看上去將會越來越亂斋射,越來也不易管理育勺。

什么是類

類是對現(xiàn)實生活中一類具有共同特征的事物的抽象。所有的事物都來源于生活罗岖,不管哪行哪業(yè)都是為了解決我們生活中的問題涧至,編程亦是。

類的三大屬性

  • 封裝:類將具有共同特征的一類事物抽象在一起桑包,比如水果類包含蘋果南蓬、香蕉、梨子哑了、西瓜等等赘方,這些具有同樣屬性的我們可以歸為到一個類里
封裝
  • 繼承:類是有繼承關系的,繼承關系的作用是讓子類具有自己特有的行為弱左,不如西瓜是它是繼承水果的窄陡,那么西瓜它可以定義自己特有的行為、屬性科贬,像有籽西瓜泳梆、無籽西瓜兩種屬性,子類可以繼承父類的公有方法和屬性榜掌。什么意思呢优妙,就像你可以繼承你爸媽的財產(chǎn),但是你不能繼承你爸媽的朋友憎账,或隱私方面的東西套硼,隱私方面的東西在編程語言中我們稱之為private(私有的),私有的東西子女是不可以繼承的胞皱。還有一點就是繼承可以是多層級結構的邪意,就像你可以繼承你爸媽的財產(chǎn),你兒子也能繼承你的財產(chǎn)反砌,那么你兒子的財產(chǎn)就包含了你的和爸媽的財產(chǎn)雾鬼。
繼承
  • 多態(tài):從字面意思理解就是多鐘形態(tài),專業(yè)的解釋就是:多態(tài)性是允許你將父對象設置成為一個或更多的他的子對象相等的技術宴树,賦值之后策菜,父對象就可以根據(jù)當前賦值給它的子對象的特性以不同的方式運作。專業(yè)解釋我想信大多初學者都不明白啥意思。舉個例子:某公司A和幾個快遞服務公司有合作關系又憨,比如順風翠霍、中通、申通蠢莺。順風快遞給A公司打電話說你們公司今年的快件服務我包了寒匙,那么從簽訂合同日起,A公司的所有快遞服務都會自動的通過順風快遞走躏将,同理锄弱,明年若是中通簽了合同,那么A公司明年的快遞服務都自動的走中通快遞服務祸憋。我相信講到這里大家應該能明白多態(tài)是什么意思了棵癣,多態(tài)說百了就是種接口服務。就像公司A它提供了一個快遞服務接口夺衍,那么只要是快遞公司都可以去調(diào)用這個接口狈谊。調(diào)用接口后就按照自己公司的物流走就是了。
多態(tài)-擎天柱

類的定義

class myclass(object):
    class_suite

類的定義主要是使用關鍵字「class」沟沙,類定義好了以后可以在類里定義方法河劝,變量;專業(yè)術語稱之為行為矛紫,屬性赎瞎。

類的繼承

class A(object):
    def foo(self):
        print('this is A')

class B(A):
    pass

class C(B):
    pass

if __name__ == '__main__':
    cc = C()
    cc.foo()

類C繼承類B,類B繼承類A颊咬,pass關鍵字的意思是什么也不做务甥,在類中定義方法第一個參數(shù)都是self,表示類本身喳篇,如果你接觸過C/C++語言敞临,那么這里的self就跟C/C++語言里的this指針一個意思。

  • 「if _name_ == '_main_'」:這一句是入口函數(shù)麸澜,當我們運行該程序時解釋器從這里開始執(zhí)行挺尿。
  • 「cc = C()」:創(chuàng)建一個C類型的實例,只有創(chuàng)建了實例才能去調(diào)用類中的方法和屬性炊邦,
  • 「cc.foo()」: 這一句就充分體現(xiàn)了類的繼承關系编矾, 類C沒有定義foo()方法,當時它繼承了B馁害,B又繼承了A窄俏,所以C自然也就繼承了A的foo方法,這就是繼承的好處碘菜,如果父類提供了你需要的方法凹蜈,你就不需要再去重復定義實現(xiàn)了怒详。

繼承中的覆蓋(Overriding)

繼承中的覆蓋是什么意思呢,如果類B也要實現(xiàn)方法foo踪区,當時它的方法和類A的行為是不是一樣的,那我們就稱這種行為為覆蓋

class A(object):
    def foo(self):
        print('this is A')

class B(A):
    def foo(self):
        print('this is B')

class C(B):
    def foo(self):
        print('this is C')

if __name__ == '__main__':
    cc = C()
    cc.foo()

結果將會輸出‘this is C’吊骤,類C中的foo方法就是C類特有的行為缎岗。那么到這里有認真思考過的同學就要問,我又想有自己的行為白粉,也想調(diào)用父類的行為怎么辦呢传泊,看下面的代碼

class A(object):
    def foo(self):
        print('this is A')

class B(A): 
    def foo(self):
        A.foo(self)
        print('this is B')

class C(B):
    def foo(self):
        B.foo(self)
        print('this is C')

if __name__ == '__main__':
    cc = C()
    cc.foo()

執(zhí)行的結果將會輸出

this is A
this is B
this is C

super的使用

上面例子的寫法雖然可以達到目的,但不是一種好的寫法鸭巴,它的不好之處在于若在你的工程中有大量的此種寫法眷细,那么若是類的繼承關系變了,那你不得不在整個工程中去查找修改相應的代碼鹃祖,這里我們使用super的方式改寫它溪椎。

class A(object):
    def foo(self):
        print('this is A')

class B(A): 
    def foo(self):
        super(B, self).foo()
        print('this is B')

class C(B):
    def foo(self):
        super(C, self).foo()
        print('this is C')

if __name__ == '__main__':
    cc = C()
    cc.foo()

輸出的結果和上面一致,使用super()的漂亮之處在于恬口,你不需要明確給出任何基類名字...“跑腿事兒”校读,它幫你干了!使用super()的重點祖能,是你不需要明確提供父類歉秫。這意味著如果你改變了類繼承關系,你只需要改一行代碼(class 語句本身)而不必在大量代碼中去查找所有被修改的那個類的名字养铸。

構造器init()

構造器也叫構造函數(shù)雁芙,當一個類實例化的時候它將會自動調(diào)用該函數(shù),這里我們需要提點的是钞螟,在python中類B繼承了類A兔甘,他們都實現(xiàn)了_init_()函數(shù),那么當類B實例化的時候不會去調(diào)用類A的構造方法了鳞滨,這個和C/C++裂明,JAVA語言是不同的,大家要注意這點

class A(object):
    def __init__(self):
        print('this is A init')
    def foo(self):
        print('this is A')

class B(A): 
    def __init__(self):
        print('this is B init')
    def foo(self):
        super(B, self).foo()
        print('this is B')

class C(B):
    def __init__(self):
        print('this is C init')
    def foo(self):
        super(C, self).foo()
        print('this is C')

if __name__ == '__main__':
    cc = C()
    cc.foo()

執(zhí)行結果將會輸出

this is C init
this is A
this is B
this is C

可以看到它并沒有去調(diào)用A,B類的構造器init()方法太援,如果C不定義會輸出什么大家可以自己去試試

私有屬性闽晦,私有方法

在python中,類中的所有方法和屬性默認是‘public’共有的提岔,可以被繼承的仙蛉,那么如果想要屬性和方法不能被繼承怎么辦呢,那就是在屬性和方法的定義前加兩個下劃線碱蒙, 特別需要提點的是我們自己內(nèi)中定義的函數(shù)不要有想_xxx_()這種定義荠瘪,這種定義是python內(nèi)建函數(shù)的定義夯巷,切記、切記哀墓。

class A(object):
   
    def __foo(self):
        print('this is A')

class B(A): 
   pass
   

class C(B):
   pass

if __name__ == '__main__':
    print(dir(C))
    cc = C()
    cc.__foo()

執(zhí)行結果將會出現(xiàn)下面錯誤

Traceback (most recent call last):
  File "classtest.py", line 16, in <module>
    cc.__foo()
AttributeError: 'C' object has no attribute '__foo'

多態(tài)的實現(xiàn)

下面我們將實現(xiàn)一個多態(tài)的例子來結束本章的內(nèi)容趁餐,例子的來源還是用上面提供的快遞服務

class Company(object):
    #提供一個快遞服務接口
    def express_service(self, express_company):
         express_company.send()

#順風快遞公司
class FS(Company):
    def send(self):
        print('welcome to express by FS')

#中通跨地公司
class ZT(Company):
    def send(self):
        print('welcome to express by ZT')

#申通跨地公司
class ST(Company):
    def send(self):
        print('welcome to express by ST')

if __name__ == '__main__':
    service = Company()
    #使用FS快遞服務
    fs = FS()
    service.express_service(fs)
    #使用ZT快遞服務
    zt = ZT()
    service.express_service(zt)
    #使用ST快遞服務
    st = ST()
    service.express_service(st)

各位若是初學者一定要敲代碼,去執(zhí)行篮绰,去體會一下類的三大屬性


note: 初學者最容易犯的錯就是書面上看著挺簡單的啊后雷,把書一關上就懵了,想要成為一個程序員吠各,一定要多去敲代碼臀突,切記,切記

歡迎關注我:「愛做飯的老謝」贾漏,老謝一直在努力...

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末候学,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子纵散,更是在濱河造成了極大的恐慌梳码,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伍掀,死亡現(xiàn)場離奇詭異边翁,居然都是意外死亡,警方通過查閱死者的電腦和手機硕盹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門符匾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瘩例,你說我怎么就攤上這事啊胶。” “怎么了垛贤?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵焰坪,是天一觀的道長。 經(jīng)常有香客問我聘惦,道長某饰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任善绎,我火速辦了婚禮黔漂,結果婚禮上,老公的妹妹穿的比我還像新娘禀酱。我一直安慰自己炬守,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布剂跟。 她就那樣靜靜地躺著减途,像睡著了一般酣藻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鳍置,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天辽剧,我揣著相機與錄音,去河邊找鬼税产。 笑死怕轿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的砖第。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼环凿,長吁一口氣:“原來是場噩夢啊……” “哼梧兼!你這毒婦竟也來了?” 一聲冷哼從身側響起智听,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤羽杰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后到推,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體考赛,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年莉测,在試婚紗的時候發(fā)現(xiàn)自己被綠了颜骤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡捣卤,死狀恐怖忍抽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情董朝,我是刑警寧澤鸠项,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站子姜,受9級特大地震影響祟绊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哥捕,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一牧抽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧遥赚,春花似錦阎姥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泽腮。三九已至,卻和暖如春衣赶,著一層夾襖步出監(jiān)牢的瞬間诊赊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工府瞄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碧磅,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓遵馆,卻偏偏與公主長得像鲸郊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子货邓,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理秆撮,服務發(fā)現(xiàn),斷路器换况,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法职辨,類相關的語法,內(nèi)部類的語法戈二,繼承相關的語法舒裤,異常的語法,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 特別說明觉吭,為便于查閱腾供,文章轉自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 1,118評論 0 4
  • 小麥爸爸是個重情義的人,心里一直惦記著這一家三口鲜滩,托人四處打聽台腥。后來聽說他們搬去了S市,在那兒又干起了老本行绒北,種蔬...
    Williamlora閱讀 226評論 0 0
  • 因為條件限制黎侈,結束作品依然是鉛筆畫。 臨摹了許久闷游,想著也算是完成了100幅峻汉,到最后何不自己創(chuàng)作幾幅?脐往! 可真拿起筆...
    葉聽雨閱讀 592評論 19 17