1. 開放封閉原則
一個軟件實體如類、模塊和函數應該對擴展開放,對修改關閉。即軟件實體應該在不修改原代碼的情況下進行修改。
2. 里氏替換原則
所有引用父類的地方必須能透明地使用其子類地方必須能透明地使用其子類的對象,一個簡單的例子加強理解
class User(object):
def print_name(self):
pass
class VipUser(User):
def print_name(self):
"""
保證參數和返回值類型需要和父類一樣
:return:
"""
pass
def print_name(u):
"""
不論使用User還是繼承User的VipUser,調用的方式是一樣的。這就要求User和VipUser的方法參數和返回值類型是一樣的
:param u:
:return:
"""
u.print_name()
3. 依賴倒置原則
高層模塊不應該依賴底層模塊,二者都應該依賴抽象。抽象不應該依賴細節,細節應該應該依賴抽象。要針對接口編程,而不是針對實現變成
。通過例子加強理解:
from abc import ABCMeta, abstractmethod
# 接口,抽象不應該依賴細節
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self, money):
pass
# 底層代碼和高層代碼都是細節,細節應該依賴抽象
# 底層代碼
class Alipay(Payment):
def pay(self, money):
print("支付寶支付了{0}元!".format(money))
class WechatPay(Payment):
def pay(self, money):
print("微信支付了%d元!" % (money))
# 高層代碼,高層模塊不應該依賴底層模塊,二者都應該依賴抽象
a = Alipay()
w = WechatPay()
a.pay(100)
w.pay(100)
4. 接口隔離原則
使用多個專門的接口,而不使用單一的總結口,高層的代碼不應該依賴那些它不需要的接口。通過例子加強理解:
from abc import ABCMeta, abstractmethod
class LandAnimal(metaclass=ABCMeta):
@abstractmethod
def walk(self):
pass
class WaterAnimal(metaclass=ABCMeta):
@abstractmethod
def swim(self):
pass
class SkyAnimal(metaclass=ABCMeta):
@abstractmethod
def fly(self):
pass
# 高層的代碼不應該依賴那些它不需要的接口
class Tiger(LandAnimal):
def walk(self):
pass
# 高層的代碼不應該依賴那些它不需要的接口
class Frog(LandAnimal, WaterAnimal):
def walk(self):
pass
5. 單一職責原則
不要存在多於一個導致類變更的原因,一個類只負責一項職責,一個類只做一件事。把面向過程的代碼放到類中,雖然用到了類,但不是面向對象
。