抽象类与接口类

抽象类与接口类

接口类 : 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代码

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值