接口类:
继承有两种用途:
一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)
二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能
在Python中是没有接口的概念的(接口是在Java里的)
from abc import ABCMeta,abstractmethod#调用abc模块中的抽象方法 # 接口类 : 接口类就是一个规范 接口类一般是项目设计人员写好的 class Payment(metaclass=ABCMeta): #规范 @abstractmethod def pay(self,money): ‘‘‘ :param money: :return: ‘‘‘ raise NotImplementedError class ApplePay(Payment):# 100 def pay(self,money):pass app = ApplePay() # 微信支付 # class WeChatPay(Payment): # def pay(self,money): # print(‘通过微信支付了%s元钱‘%(money)) # 支付宝支付 # class AliPay(Payment): # def pay(self,money): # print(‘通过支付宝支付了%s元钱‘%(money)) # apple pay # class ApplePay(Payment): pass # def pay(self,money): # print(‘通过支付宝支付了%s元钱‘ % (money)) # wp = WeChatPay() # alp = AliPay() # app = ApplePay() # def pay(pay_obj,money): # 程序的归一化设计 # pay_obj.pay(money) # pay(alp,100) # pay(wp,100) # pay(app,100)
接口类是一种规范,从上述代码可知,没一种支付方式都是一个类,每个类中定义一种支付方法完成功能,由于每个支付方法在程序中表现出来的就是支付类的对象,我们要拿到每一个支付方法,位了方便支付方法的调用,都需要统一一个入口。pay函数。因为在Python中没有节后类这种数据类型,没有接口类专门的语法,这时候我们可以继承abc模块实现接口的功能。
接口类开发原则
需要注意的是:接口类不能被实例化!
抽象类:
定义: 规范一个类的类 与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化
与接口类的区别:
在Python中,抽象类和接口类没有区别
在java里 有区别:
java的接口类规定 类里面的方法一定不能实现(一句代码也不能写)
抽象类 是单继承
无论接口类 还是抽象类 其实都是一种面向对象编程的开发规范
只是在接口类或者抽象类中 去约束继承它的子类必须实现某些方法
对于java代码来说:如果发生多继承 那么一定是接口类 且里面的方法都不能实现
# 如果在方法里有了实现 那么一定是单继承 的抽象类
# 但是对于python来说 就没有这些约束
# 因为python没有接口的概念
# 对于类的继承 没有多继承的限制
# 实际上abc模块是帮我们实现抽象类的方法,只是我们用它来模仿接口类的效果了
在python中,只要metaclass = ABCMeta 定义了抽象方法(@abctractmethod)
# 这个类就不能被实例化
# 你可以说他是一个抽象类
from abc import ABCMeta, abstractmethod class File(metaclass=ABCMeta): @abstractmethod def read(self): f = open(‘file‘, ‘r‘) self.f = f @abstractmethod def write(self): f = open(‘file‘, ‘w‘) class Word(File): def read(self): # 打开一个文件 # 读文件 # 关闭一个文件 super().read() self.f.read() self.f.close() class Excle(File): def read(self): # 打开一个文件 # 读某一列 读某一列 # 关闭一个文件 super().read() self.f.readline() self.f.close() class PPT(File): def read(self): # 打开一个文件 # 读文字 读表格 读图片 # 关闭一个文件 super().read() self.f.readpicture() self.f.close()
多态:所有的类都继承父类
Python是自带多态的(也可以理解为Python都是继承了object这个父类)
Python是一门动态强类型语言
# class WeChatPay: # def pay(self,money): # print(‘通过微信支付了%s元钱‘%(money)) # class AliPay: # def pay(self,money): # print(‘通过支付宝支付了%s元钱‘%(money)) # def pay(pay_obj,money): # 程序的归一化设计 # pay_obj.pay(money) # w = WeChatPay() # a = AliPay() # pay(w,100)
鸭子类型:将大致相同的属性归为一个父类,供子类调用
Java崇尚接口类,Python崇尚鸭子类型