开放封闭原则
类,模块,函数应该对扩展开放,对修改关闭
里氏替换原则
所有引用基类的地方必须能透明地使用其子类的对象
class BaseMent(object):
def return_something(self):
pass
class child(BaseMent):
def return_something(self):
pass
def a_fun(c):
res = c.return_something()
.....
#a_fun中传入一个对象调用return_something(),保证BaseMent和child中继承的方法的参数和返回值必须一样,
#保证里氏替换原则,不然a_fun中使用返回值进行接下来的逻辑会出错
依赖倒置原则
1、上层模块不应该依赖底层模块,它们都应该依赖于抽象。
2、抽象不应该依赖于细节,细节应该依赖于抽象。
针对接口编程而不是针对实现编程
from abc import ABCMeta,abstractmethod
#这个类就是底层和上层的抽象
#这个就是抽象
class payment(object):
__metaclass__ = ABCMeta
@abstractmethod
def pay(self,money):
pass
#这两个支付类就是模拟底层的实现逻辑
#下面是细节
class AliPay(payment):
def pay(self,money):
print "支付宝支付%d" % money
pass
class WeChatPay(payment):
def pay(self,money):
pass
#模拟上层调用逻辑
p = AliPay()
p.pay(100)
#抽象不应该依赖于细节,细节应该依赖于抽象
接口隔离原则
使用多个专门的接口,不要使用总接口,即client不应该依赖不需要的接口
举例总接口
from abc import ABCMeta,abstractmethod
class Animal(object):
__metaclass__ = ABCMeta #抽象类提供的元类
@abstractmethod
def walk(self):
pass
@abstractmethod
def swim(self):
pass
@abstractmethod
def fly(self):
pass
class pig(Animal):
def walk(self):
pass
pig = pig()
pig.walk()
#假设猪只会走路,不会飞,但是继承抽象类就要实现所有抽象方法,会报错
所以不要使用总接口,应该把接口分开,只用专用的接口
修改
from abc import ABCMeta,abstractmethod
class LandAnimal(object):
__metaclass__ = ABCMeta #抽象类提供的元类
@abstractmethod
def walk(self):
pass
class WaterAnimal(object):
__metaclass__ = ABCMeta # 抽象类提供的元类
@abstractmethod
def swim(self):
pass
class SkyAnimal(object):
__metaclass__ = ABCMeta # 抽象类提供的元类
@abstractmethod
def fly(self):
pass
class pig(LandAnimal):
def walk(self):
pass
单一职责原则
一个类应该只有一个发生变化的原因,人话就是:一个类负责一个职责,参考上面的动物类