python介面類 Python中的介面類與抽象類

2021-10-11 05:33:57 字數 2636 閱讀 6404

介面類

物件導向中的繼承有兩種用途: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...