【Python基础】Python 面向对象编程(下篇)
已完成專題
1我的施工計劃
2數(shù)字專題
3字符串專題
4列表專題
5流程控制專題
6編程風格專題
7函數(shù)使用
8.面向對象編程(上篇)
上一篇面向對象編程(上篇)討論了面向對象編程的基礎部分,使用案例講解了三大特性:封裝、繼承、多態(tài)。
今天繼續(xù)討論面向對象編程的進階部分
進階專題
1 創(chuàng)建抽象方法
上篇講解多態(tài)部分,定義了基類模塊animals2.py,它里面有一個方法getSpeedBehavior,然后2個繼承類中分別重寫了此方法。雖然這種模式并不會報錯,但卻不是最佳編程寫法。
class?Animal():cprop?=?"我是類上的屬性cprop"def?__init__(self,name,speed):self.name?=?name?#?動物名字self._speed?=?speed?#?動物行走或飛行速度def?__str__(self):return?'''Animal({0.name},{0._speed})?is?printedname={0.name}speed={0._speed}'''.format(self)def?getSpeedBehavior(self):pass?更加優(yōu)秀的做法,顯示的定義基類的此方法為抽象方法,并且明確指名這兩個繼承類需要重寫此方法。
借助Python內置的abc模塊,使用abstractmethod裝飾器,Animal類的改進版:
import?abcclass?Animal():cprop?=?"我是類上的屬性cprop"def?__init__(self,name,speed):self.name?=?name?#?動物名字self._speed?=?speed?#?動物行走或飛行速度def?__str__(self):return?'''Animal({0.name},{0._speed})?is?printedname={0.name}speed={0._speed}'''.format(self)#?使用abstractmethod裝飾器后,變?yōu)槌橄蠓椒?#64;abc.abstractmethoddef?getSpeedBehavior(self):pass其他類都不改變。以上就是創(chuàng)建抽象類的方法。
2 檢查屬性取值
已經(jīng)在Animal類中定義2個屬性name和_speed:
class?Animal():cprop?=?"我是類上的屬性cprop"def?__init__(self,name,speed):self.name?=?name?#?動物名字self._speed?=?speed?#?動物行走或飛行速度像這種方法定義的屬性,外界可以對屬性賦任意值,這不是合理的。如下speed參數(shù)被賦值為負值,這肯定不合理:
jiafeimao?=?Cat('jiafeimao',-2,'gray','CatGenre')所以一種解決方法便是使用@property,寫法也很簡潔:
???#?讀@property?def?_speed(self):return?self.__speed#?寫@_speed.setterdef?_speed(self,val):if?val?<?0:raise?ValueError('speed?value?is?negative')self.__speed?=?valCat('jiafeimao',-2,'gray','CatGenre')執(zhí)行時,會進入到@_speed.setter,檢查不滿足,拋出取值異常。
@property就是給_speed函數(shù)增加功能后返回一個更強大的函數(shù),@屬性.setter也是一個函數(shù),裝飾后控制著屬性的寫入操作。
3 給類添加屬性
基礎篇說到為實例添加屬性,只對此實例生效,其他屬性還是沒有此屬性。怎樣在外面一次添加屬性后,所有實例都能具有呢。
答案是為類添加屬性,如下所示,為Cat類增加屬性age后,jiafeimao實例 和jiqimao實例都有了age屬性,且都可被修改:
if?__name__?==?"__main__":jiafeimao?=?Cat('jiafeimao',2,'gray','CatGenre')Cat.age?=?1jiafeimao.age?=?3print(jiafeimao.age)?#?3?jiqimao?=?Cat('jiqimao',3,'dark','CatGenre')jiqimao.age?=?5print(jiqimao.age)?#?5這就說明,一次為類添加一個屬性,類的所有實例都會有這個新增的屬性。
這種雖然寫法便利,但是會帶來副作用,支持動態(tài)添加實際上破壞了類的封裝性,為維護程序帶來不便。同時,如果泛濫使用,屬性過多占用內存就會變大,影響程序的性能。
4 控制隨意添加屬性
Python應該意識到上面動態(tài)添加屬性帶來的副作用,因此留出一個系統(tǒng)魔法函數(shù)__slots__,以此來控制隨意在外添加屬性。
使用__slots__,定義這個類只能有哪些屬性,不在這個元組里的屬性添加都會失敗。
如下這樣做后,控制Student類只能有屬性name和age,不允許添加其他屬性:
class?Student(object):__slots__?=?('name',?'age')?#?用tuple定義允許綁定的屬性名稱def?__init__(self,name,age):self.name?=?nameself.age?=?ages?=?Student('xiaoming',100)?#?創(chuàng)建新的實例 s.score=10如下異常:
5 鏈式調用
每個對外公開的方法,都返回self,這樣在外面調用時,便能形成一條鏈式調用線,在pyecharts等框架中可以看到這種調用風格。
class?Student(object):__slots__?=?('name',?'age')?#?用tuple定義允許綁定的屬性名稱def?__init__(self,name,age):self.name?=?nameself.age?=?agedef?set_name(self,val):self.name?=?val?return?self?def?set_age(self,age):self.age?=?age?return?selfdef?print_info(self):print("name:?"+self.name)print("age:?"+?str(self.age))return?selfs?=?Student('xiaoming',100)?#?創(chuàng)建新的實例(s.set_name('xiaoming1').set_age(25).print_info() )關于面向對象編程的進階部分,還有一個重要的設計原則:MixIn 原則,這個我們放到后面在講設計模式時一起討論。
以上就是面向對象編程的進階部分,原創(chuàng)不易,歡迎三連支持。
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統(tǒng)計學習方法》的代碼復現(xiàn)專輯 AI基礎下載機器學習的數(shù)學基礎專輯獲取一折本站知識星球優(yōu)惠券,復制鏈接直接打開:https://t.zsxq.com/662nyZF本站qq群1003271085。加入微信群請掃碼進群(如果是博士或者準備讀博士請說明):總結
以上是生活随笔為你收集整理的【Python基础】Python 面向对象编程(下篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【科研经验】学霸为什么不喜欢给学渣解题?
- 下一篇: 【Python基础】Python 面向对