面向對象特性
封裝 繼承 多態 抽象
封裝
1. 任何對象都有明確的邊界,將屬性保護在邊界之內 -- 可以將數據進行隱藏
2. 封裝的粒度
粒度過小:
對象過於簡單,過程過於複雜
粒度過大:
對象過於複雜,不利於各司其職
分門別類
封裝的好處
簡化了編程模型,更容易記憶,調用封裝的內容。
體現了代碼可重用性
繼承性
1. 類與類之間的關係
2. 父類(更加抽象的類) 與 子類(相對具象的類)
3. 語法規範
class 子類類名(父類的類名):
pass
繼承的特點:
1. 子類可以繼承父類成員,但是不能繼承父類的私有成員
本質上私有成員也被繼承了下來,只不過訪問方式發生了改變
2. 如果子類沒有初始化方法,則調用父類的初始化方法
3. 如果子類和父類都沒有初始化方法,則調用object的初始化方法
4. 如果子類實現了和父類一樣的方法,則子類的方法會遮蔽父類的方法。
5. python是多繼承的,一個子類可以繼承多個父類。
1.亂倫問題
2.鑽石繼承問題(菱形問題)
如果有一個類,有多個子類,這些類又有相同的子類,此時子類調用父類的初始化方法時,越高級的類調用的次數越多,造成繼承浪費。
解決方案:
super().__init__()
super() 代指父類的實例對象(mro繼承鏈式關係)
多態性
1. 不同對象收到相同消息時產生的不同動作。
依託於繼承的
父類可以有多個子類的表現形式
使用父類的聲明,可以傳入任何子類,依然可以正確運行。
2. 沒有繼承就沒有多態
多態是繼承的衍生品
3. 不同對象可以具有多種表現形式。
多態的作用:
1.增加了程序的靈活性
2.增加了程序的可擴展性
類與對象在python中一些內置函數
1. issubclass(clss1,class2)
如果class1 是class2的子類 返回True 否則返回False
2. isinstance(obj1,class1)
如果obj1是class1的實例對象 則返回True 否則返回False
3, hasattr(obj1,name)
如果這個對象有name屬性返回True
4. getattr(obj1,name[,default])
如果obj1中有name屬性則返回name屬性對應的值,如果沒有且沒有default則報錯,如果沒有但是有default則返回default
5. delattr(obj1,name)
6. setattr(obj1,name,value)