一:什么叫归一化设计:
首先来看看下面这段程序:
class Alipay(Payment): def pay(self,money): print('使用支付宝支付了%s元'%money) class QQpay: def pay(self,money): print('使用qq支付了%s元'%money) def pay(a,money): a.pay(money) #做归一化设计 a = Alipay() pay(a,100) q = QQpay() pay(q,100)
归一化设计就是要求:不管哪一个类的对象,都调用同一个函数去完成相似的功能。
ps:依赖倒置原则如下:
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程。
二:接口类和抽象类
1,抽象类与接口类就是建立规范的,制定一个类的metaclass是ABCMeta,那么这个类就变成了一个抽象类(接口类)。
2,抽象类中所有被abstractmethod装饰的方法都必须被继承的子类实现,如果不实现,那么在实例化阶段将会报错。
3,无论是抽象类还是接口类metaclass=ABCMeta 都不可以被实例化。
from abc import ABCMeta,abstractmethod class Payment(metaclass=ABCMeta): # 抽象类 接口类 规范和约束 metaclass指定的是一个元类 @abstractmethod def pay(self):pass # 抽象方法 class Alipay(Payment): def pay(self,money): print('使用支付宝支付了%s元'%money) def pay(a, money): a.pay(money) a = Alipay() pay(a,100)
三:接口隔离操作
1,什么叫接口?
python里并没有接口的概念,那接口是哪儿来的概念呢?因为java类没有多继承,接口可以实现多继承。而在python中,满足接口隔离原则,由于python本身支持多继承,所以就不需要接口的概念了.
2,抽象类和接口类在python中是相同的,都是用于约束子类中的方法的,只要是抽象类和接口类中被abstractmethod装饰的方法,都需要被子类实现。需要注意的是,当多个类之间有相同的功能也有不同的功能的时候,应该采用多个接口类来进行分别的约束
3,在java中,抽象类和接口截然不同,抽象类的本质还是一个类,是类就必须遵循单继承的规则,所以一个子类如果被抽象类约束,那么它只能被一个父类控制,当多个类之间有相同的功能也有不同的功能的时候,java只能用接口来解决问题。
from abc import ABCMeta,abstractmethod class FlyAnimal(metaclass=ABCMeta): @abstractmethod def fly(self):pass @abstractmethod def cal_flying_speed(self):pass @abstractmethod def cal_flying_height(self):pass class WalkAnimal(metaclass=ABCMeta): @abstractmethod def walk(self):pass class SwimAnimal(metaclass=ABCMeta): @abstractmethod def walk(self):pass class Tiger(WalkAnimal,SwimAnimal): def walk(self):pass def swim(self):pass class Monkey: def walk(self):pass def climb(self):pass class Swan(FlyAnimal,WalkAnimal,SwimAnimal): def swim(self):pass def walk(self):pass def fly(self):pass def cal_flying_speed(self):pass def cal_flying_height(self):pass class Parrot(FlyAnimal): def fly(self):pass def cal_flying_speed(self):pass def cal_flying_height(self): pass
ps:接口隔离原则如下:
使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口。