抽象类与接口类
接口类 : python原生不支持
支持多继承,接口类中的所有的方法都必须不能实现 —— java
不能被实例化
抽象类 : python原生支持的
不支持多继承,抽象类中方法可以有一些代码的实现 —— java
抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化
类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。
现有下面程序,功能:选择支付的手段(支付宝或微信)
class Alipay:
def pay(self,money):
print('支付宝支付了%s元'%money)
class Applepay:
def pay(self,money):
print('apple pay支付了%s元'%money)
def pay(payment,money):
payment.pay(money)
p = Alipay()
pay(p,200)
如果现在想增加一个新类:微信支付,但新类中未使用pay()函数,如何发现错误
a.手动报异常:NotImplementedError来解决
class Payment:
def pay(self):
raise NotImplemented #没有实现这个方法
class Wechatpay(Payment): #继承Payment
def fuqian(self,money): #未使用pay
print('微信支付了%s元'%money)
def pay(payment,money):
payment.pay(money)
p = Wechatpay()
pay(p,200) #支付函数只能调用pay,没有就报错异常
b.借用abc模块来实现接口
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self,money):
pass
class Wechatpay(Payment):
def fuqian(self,money):
print('微信支付了%s元'%money)
p = Wechatpay() #不调就报错了
'''
TypeError: Can't instantiate abstract class Wechat with abstract methods pay
''''
接口的多继承
from abc import abstractmethod,ABCMeta
class Swim_Animal(metaclass=ABCMeta):
@abstractmethod
def swim(self):pass
class Walk_Animal(metaclass=ABCMeta):
@abstractmethod
def walk(self):pass
class Fly_Animal(metaclass=ABCMeta):
@abstractmethod
def fly(self):pass
class Tiger(Walk_Animal,Swim_Animal): #多继承
def walk(self):
pass
def swim(self):
pass
class OldYing(Fly_Animal,Walk_Animal):pass
class Swan(Swim_Animal,Walk_Animal,Fly_Animal):pass
接口隔离原则: 使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口。
依赖倒置原则: 高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程
抽象类和接口类 : 面向对象的开发规范 所有的接口类和抽象类都不能实例化
java : java里的所有类的继承都是单继承,所以抽象类完美的解决了单继承需求中的规范问题
但对于多继承的需求,由于java本身语法的不支持,所以创建了接口Interface这个概念来解决多继承的规范问题
python: python中没有接口类 : python中自带多继承 所以我们直接用class来实现了接口类
python中支持抽象类 : 一般情况下 单继承 不能实例化,且可以实现python代码