
继承在面向对象中有两个目的: 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
你你可以委婉的说
他自己说的