乙個軟體實體如類、模組和函式應該對擴充套件開放,對修改關閉。即軟體實體應該在不修改原**的情況下進行修改。
所有引用父類的地方必須能透明地使用其子類地方必須能透明地使用其子類的物件,乙個簡單的例子加強理解
class
user
(object):
defprint_name
(self)
:pass
class
vipuser
(user)
:def
print_name
(self)
:"""
保證引數和返回值型別需要和父類一樣
:return:
"""pass
defprint_name
(u):
""" 不論使用user還是繼承user的vipuser,呼叫的方式是一樣的。這就要求user和vipuser的方法引數和返回值型別是一樣的
:param u:
:return:
"""u.print_name(
)
高層模組不應該依賴底層模組,二者都應該依賴抽象。抽象不應該依賴細節,細節應該應該依賴抽象。要針對介面程式設計,而不是針對實現變成。通過例子加強理解:
from abc import abcmeta, abstractmethod
# 介面,抽象不應該依賴細節
class
payment
(metaclass=abcmeta)
: @abstractmethod
defpay(self, money)
:pass
# 底層**和高層**都是細節,細節應該依賴抽象
# 底層**
class
alipay
(payment)
:def
pay(self, money)
:print
("支付寶支付了元!"
.format
(money)
)class
wechatpay
(payment)
:def
pay(self, money)
:print(%
(money)
)# 高層**,高層模組不應該依賴底層模組,二者都應該依賴抽象
a = alipay(
)w = wechatpay(
)a.pay(
100)
w.pay(
100)
使用多個專門的介面,而不使用單一的總結口,高層的**不應該依賴那些它不需要的介面。通過例子加強理解:
from abc import abcmeta, abstractmethod
class
landanimal
(metaclass=abcmeta)
: @abstractmethod
defwalk
(self)
:pass
class
wateranimal
(metaclass=abcmeta)
: @abstractmethod
defswim
(self)
:pass
class
skyanimal
(metaclass=abcmeta)
: @abstractmethod
deffly(self)
:pass
# 高層的**不應該依賴那些它不需要的介面
class
tiger
(landanimal)
:def
walk
(self)
:pass
# 高層的**不應該依賴那些它不需要的介面
class
frog
(landanimal, wateranimal)
:def
walk
(self)
:pass
不要存在多於乙個導致類變更的原因,乙個類只負責一項職責,乙個類只做一件事。把面向過程的**放到類中,雖然用到了類,但不是物件導向。
Python常用設計模式 工廠模式
工廠模式是乙個在軟體開發中用來建立物件的設計模式。當程式執行輸入乙個 型別 的時候,需要建立於此相應的物件。這就用到了工廠模式。在如此情形中,實現 基於工廠模式,可以達到可擴充套件,可維護的 當增加乙個新的型別,不在需要修改已存在的類,只增加能夠產生新型別的子類。設計模式的 工廠 這個概念就是 於我...
python常用設計模式(1)
設計模式 於建築行業,中西方建築各有自己的風格 每種風格都有自己的建築方法 套 路 只要按照不同風格的建築方法 套路 就能建成不同風格的建築 簡單的說設計模式就是一 種 方法 套路 再比如肯德基麥當勞快餐店為什麼全球的口味都一樣呢?就是做食品的套路相 同 炸雞塊多長時間都是固定的 程式中設計模式是軟...
python物件導向 單例設計模式
設計模式時前人工作的總計和提煉,通常,被人們廣泛流傳的設計模式都是針對某一特定問題的成熟的解決方案 單例設計模式的應用場景 單例 讓類建立的物件,在系統中只有唯一的乙個例項 實現思路 1 定義乙個類屬性,初始值是none,用於記錄單例物件的引用 2 重寫 new 方法 3 如果此類屬性 is non...