介面類
物件導向中的繼承有兩種用途:1)可以通過繼承做到**重用,並完成擴充套件;2)介面繼承。
所謂的介面繼承就是定義乙個介面類 inte***ce,介面類中定義了一些介面(就是函式,但這些函式都沒有具體的實現),子類繼承介面類,並且實現介面中的功能~
介面繼承可以使得外部呼叫者無需關心具體的實現細節,可用相同的方式處理繼承了特定介面的所有物件,這裡的前提是介面類需要做出乙個很好的抽象~
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模組就是用來實現抽象類的,當乙個抽象類中所有的方法都沒有實現時,那就認為這是乙個介面類了~
Python 介面類 抽象類
建立乙個介面類 抽象類的規範 from abc import abstractmethod,abcmeta class payment metaclass abcmeta 元類 預設的元類 type abstractmethod def pay self,money pass 沒有實現這個方法 介面...
python介面 python 介面
一 urllib模組 urllib模組是乙個標準模組,直接import urllib即可,在python3裡面只有urllib模組,在python2裡面有urllib模組和urllib2模組。urllib模組太麻煩了,傳引數的話,都得是bytes型別,返回資料也是bytes型別,還得解碼,想直接把返...
python 介面類和抽象類
介面類和抽象類的作用 物件導向的 規範 1 定義 python原生沒有,支援多繼承,介面類中的所有方法都不能實現,2 原則 介面隔離原則 3 規範 繼承介面類的類,必要要定義介面類的方法,若不實現方法,在該類例項化的過程中會報錯 4 歸一化 基於同乙個介面類實現的類,可以進行歸一化 from abc...