抽象类和接口类

抽象类

抽象类是一个模板,不能被实例化,只能被继承

抽象类不鼓励多继承

抽象类可以实现一些子类共有的功能和属性,也就是说子类中有父类中的全部方法

抽象类的定义,抽象类中的方法可以实现,可以不实现

from abc import ABCMeta,abstractmethod
class Base(metaclass=ABCMeta):
    def __init__(self,filename):
        self.filename = filename
    @abstractmethod #抽象方法
    def open(self):
        return 'file_handler'

    @abstractmethod
    def close(self):pass

    @abstractmethod
    def read(self):pass

    @abstractmethod
    def write(self):pass


class File(Base):
    def open(self):pass
    def close(self):pass
    def read(self):pass
    def write(self):pass

 

接口类:约束子类中必须含有父类中的方法

依赖倒置原则:
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该应该依赖细节;细节应该依赖抽象。
换言之,要针对接口编程,而不是针对实现编程

 

python没有接口的概念,只能借助抽象类的模块来实现接口类

接口来源于java ,java里没有多继承,interface关键字使java支持多继承

接口类也是规范子类的一个模板,同样也不能被实例化,只能被继承

接口类支持多继承(子类能够继承多个接口类),父类中的方法可以不实现功能

接口隔离原则: 使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口。

继承接口类的子类中必须有接口类中的所有的方法

class Payment(metaclass=ABCMeta): #模板,接口类
    @abstractmethod  #装饰接口类中方法的,加上这个装饰器,自动检测子类中的方法名
    def pay(self,money):pass

    @abstractmethod  # 没有这个方法,报错
    def get(self):pass

class Apple_Pay(Payment):
    def pay(self,money):
        print('您使用苹果支付支付了%s元'%money)

class Ali_Pay(Payment):
    def pay(self, money):
        print('您使用支付宝支付了%s元' % money)

class WeChat_Pay(Payment):
    def pay(self,money):
        print('您使用微信支付了%s元' % money)

def pay(obj,money):
    return obj.pay(money)

如果子类中没有接口类中的方法,实例化时就会报错

继承普通类不用写父类中的方法,而接口类和抽象类的子类要写父类中的方法

举栗子,

定义一个抽象类,它里面有跑,飞,游三个属性,他的子类实例化的对象就能跑飞游

然而,并不是所有的子类都会跑飞游,这时就可以定义三个接口类,分别拥有跑飞游的方法,

这时就可以让子类去选择继承接口类,能实现那个就继承哪个

 

posted @ 2017-11-22 16:58  瓜田月夜  阅读(102)  评论(0)    收藏  举报