Python中的接口和抽象类

电脑杂谈  发布时间:2020-05-20 09:27:13  来源:网络整理

抽象数据类型的实现_抽象类实现接口_接口和抽象类的区别

继承在面向对象中有两个目的: 1)代码重用可以通过继承和扩展来实现; 2)接口继承.

所谓的接口继承就是定义一个接口类Interface,它定义一些接口(即函数,但是这些函数没有特定的实现),子类继承该接口类,并在接口中实现这些功能〜

接口继承可以使外部调用者不必关心特定的实现细节抽象类实现接口,并且可以以相同的方式处理继承特定接口的所有对象. 这里的前提是接口类需要进行良好的抽象〜

抽象数据类型的实现_接口和抽象类的区别_抽象类实现接口

class Operate_database():    # 接口类
    def query(self, sql):
        raise NotImplementedError
    def update(self, sql):
        raise NotImplementedError
class Operate_mysql(Operate_database):
    def query(self, sql):
        print('query mysql : %s' % sql)
    def update(self, sql):
        print('query mysql : %s' % sql)
class Operate_pg(Operate_database):
    def query(self, sql):
        print('query postgresql : %s' % sql)
    def update(self, sql):
        print('update postgresql : %s' % sql)
def query_data(operate_obj, sql):
    operate_obj.query(sql)
def update_data(operate_obj, sql):
    operate_obj.update(sql)
query_data(Operate_mysql(), 'select ...')    # query mysql : select ...
update_data(Operate_pg(), 'update...')    # update postgresql : update...

如类现在继承了Operate_database类,但未实现某种方法的功能,则调用〜时将报告错误.

class Operate_oracle(Operate_database):
    # 没有实现 query 方法
    def update(self, sql):
        print('update oracle : %s' % sql)
def query_data(operate_obj, sql):
    operate_obj.query(sql)
query_data(Operate_oracle(), 'select ...')   # NotImplementedError

接口和抽象类的区别_抽象类实现接口_抽象数据类型的实现

当子类覆盖父类中的方法时,应注意,方法名称必须与父类中的方法名称相同,并且方法参数和参数名称的数量也必须相同〜<

这里更好的方法是通过abc模块实现接口〜

from abc import ABCMeta,abstractmethod
class Operate_database(metaclass=ABCMeta):    # 接口类
    @abstractmethod
    def query(self, sql):
        pass
    @abstractmethod
    def update(self, sql):
        pass
class Operate_oracle(Operate_database):
    # 没有实现 query 方法
    def update(self, sql):
        print('update oracle : %s' % sql)
def query_data(operate_obj, sql):
    operate_obj.query(sql)
oracle = Operate_oracle()        # 由于没有实现接口中的所有方法,在这一步就会报错
query_data(oracle, 'select ...')

抽象数据类型的实现_抽象类实现接口_接口和抽象类的区别

与接口类一样,抽象类是一个规范,用于指定子类应具有的功能.

在Python中,抽象类和接口类没有明确的界限. 如果未实现该类中的所有方法,则将其视为接口,如果实现某些方法,则将其视为抽象类. 抽象类和接口类仅用于继承,不能实例化〜

from abc import ABCMeta,abstractmethod
class Operate_database(metaclass=ABCMeta):    # 抽象类
    log_path = '/tmp/db.log'
    def connect(self):
        print('connect db ...')
    @abstractmethod
    def query(self, sql):
        pass
    @abstractmethod
    def update(self, sql):
        pass

抽象数据类型的实现_接口和抽象类的区别_抽象类实现接口

抽象类是从一堆类中提取相同的内容,这些类包括数据属性和函数属性. 如您在上面的示例中看到的,一些方法在抽象类〜

中实现

实际上,Python仅支持抽象类抽象类实现接口,不支持接口类. abc模块用于实现抽象类. 如果未实现抽象类中的所有方法,则将其视为接口类〜

........ ^ _


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-216369-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...