类的约束与归一化设计
# Python接口与归一化设计
# 1.什么是接口(interface)
# 接口(interface)是面向对象编程语言中接口操作的关键字,功能是把所需成员组合起来,用来装封一定功能的集合。它好比一个模板,在其中定义了对象必须实现的成员,通过类或结构来实现它。接口不能直接实例化,接口不能包含成员的任何代码,只定义成员本身。接口成员的具体代码由实现接口的类提供。
# 2.归一化
# 使用接口的意义在于归一化,什么叫归一化:就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。归一化的好处在于:
# 归一化让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度。
# 归一化使得上层的外部使用者可以不加区分的处理所有接口兼容的对象集合
# 1. 就好象linux的泛文件概念一样,所有东西都可以当文件处理,不必关心它是内存、磁盘、网络还是屏幕(当然,对底层设计者,当然也可以区分出“字符设备”和“块设备”,然后做出针对性的设计:细致到什么程度,视需求而定)。
# 2. 再比如:我们有一个汽车接口,里面定义了汽车所有的功能,然后由本田汽车的类,奥迪汽车的类,大众汽车的类,他们都实现了汽车接口,这样就好办了,大家只需要学会了怎么开汽车,那么无论是本田,还是奥迪,还是大众我们都会开了,开的时候根本无需关心我开的是哪一类车,操作手法(函数调用)都一样
# 在上面的情况下(在一些重要的逻辑,与用户数据相关等核心部分),我们要建立一种约束,避免发生此类错误.
# 支付接口等
# 类的约束有两种解决方式:
# 1. 在父类建立一种约束.
# 2. 模拟抽象类(指定一种规范)的概念,建立一种约束.
# 第一种解决方式: # 约定俗称定义一种规范,子类要定义pay方法. python推荐
# 第一种约束: 在父类定义一个pay方法,主动抛出异常,如果子类没有定义pay方法,并且沿用了父类的pay方法 即会报错. python推荐的一种约束方式.
# 第二种
# 利用抽象类的概念: 基类如上设置,子类如果没有定义pay方法,在实例化对象时就会报错.
第一种方法实列
# 第一种
# 第一种解决方式:
# class Payment:
# def pay(self,money): # 约定俗称定义一种规范,子类要定义pay方法.
# raise Exception('子类必须定义此方法')
# class QQpay(Payment):
# def pay(self, money):
# print(f'利用qq支付了{money}')
# class Wechatpay(Payment):
# def fuqian(self,money):
# print(f'利用微信支付了{money}')
# def pay(obj,money,): # 归一化设计
# obj.pay(money)
# # 假如
# obj=Wechatpay()
# pay(obj,300)
第2种方法实列
# 第二种: 固定写法
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta):
# 抽象类 接口类 规范和约束 metaclass指定的是一个元类
@abstractmethod
def pay(self, money):
pass # 抽象方法
class Wechatpay(Payment):
def fuqian(self,money):
print(f'利用微信支付了{money}')
# def pay(self,money):
# pass
obj3 = Wechatpay()
# 利用抽象类的概念: 基类如上设置,子类如果没有定义pay方法,在实例化对象时就会报错.