開放封閉原則
依賴導致原則
接口隔離原則
繼承多態
抽象類和接口類
編程思想:為子類做規范
歸一化設計:幾個類都實現了相同的方法
抽象類:最好單繼承,且可以簡單的實現功能
接口類:可以多繼承,且最好不實現具體功能
實現接口類和抽象類的語法
from abc import abstractclassmethod,ABCMeta class Xx(metaclass=ABCMeta): @abstractclassmethod def Yy():pass
鑽石繼承問題
python的新式類,和經典類在繼承順序上的不同
新式類:廣度優先
查看繼承順序 子類名.mro()
經典類:深度優先
新式類和經典類的區別:定義階段,經典類有object新式類不用,子類執行父類中的同名方法上,繼承問題
多態
python天生支持多態
接口類
class Applepay: def payment(self,money): print('蘋果 支付了%d元'%money) class Alipay: def payment(self,money): print('支付寶 支付了%d元'%money) def payment(pay_obj,money): pay_obj.payment(money) apple=Applepay() ali=Alipay() payment(apple,100) payment(ali,100)
歸一化設計
from abc import abstractmethod,ABCMeta class Payment(metaclass=ABCMeta): #抽象類/接口類 @abstractmethod #給接口類加裝飾器 def payment(self,money):pass class Applepay(Payment): def payment(self,money): print('蘋果 支付了%d元'%money) def payment(pay_obj,money): pay_obj.payment(money) class Alipay(Payment): def payment(self,money): print('支付寶 支付了%d元'%money) def payment(pay_obj,money): pay_obj.payment(money) class We(Payment): def fuqian(self,money) print('微信支付了%d元'%money) apple=Applepay() ali=Alipay() we=We() payment(apple,100) payment(ali,100) payment(we,100)
這樣的話,如果子類里面沒有要用的方法的話,在實例化對象的時候就會報錯
如果有這個方法的話,實例化和使用的時候都不會報錯。
主要是用來限制和規定某一類必須要用到某個方法
歸一化設計:
1.接口類 不實現具體的方法,並且可以多繼承
2.實現具體內容,做一些基礎實現,並且不推薦多繼承
多繼承
from abc import abstractclassmethod,ABCMeta class Fly_Animal(metaclass=ABCMeta): @abstractclassmethod #限制必須用fly方法 def fly(self): print('飛') class Walk_Animal: def walk(self): print('走') class Swim_Animal: def swim(self): print('游泳') class Tiger(Walk_Animal): def si(self): pass class Tiane(Walk_Animal,Swim_Animal,Fly_Animal): #多繼承 def fly(self): super().fly() class Qingwa(Walk_Animal,Swim_Animal): def fd(self): pass tiane=Tiane() tiane.fly()
多繼承限制
class D: def test(self): print('D') class B(D): #B要是沒有找D def test(self): print('B') class C(D): def test(self): print('C') class A(B,C): pass # def test(self): #如果沒有就去找B,B和D都沒有再C # print('A') a=A() a.test()
深度優先↑ 新式類廣度優先
所有類繼承的基類object新式類 python3中不用強制繼承
.mro()看順序