python?多態(tài)?協(xié)議?鴨子類型詳解
接口(python 中的協(xié)議)的多種不同的實(shí)現(xiàn)方式即為多態(tài)。多態(tài)的作用,就是為了類在繼承和派生的時(shí)候,保證使用“家譜”中任一類的實(shí)例的某一屬性時(shí)的正確調(diào)用。
from abc import ABCMeta, abstractmethod
# 鴨子類
class Dock(metaclass=ABCMeta):
@abstractmethod
def Swimming(self): # 游泳方法協(xié)議(接口)
pass
@abstractmethod # 走路協(xié)議(接口)
def Walk(self):
pass
@classmethod
def __subclasshook__(cls, C):
# 判斷是否另一個(gè)比較類是否實(shí)現(xiàn)了 Swimming Walk 協(xié)議, 如果實(shí)現(xiàn)了鴨子類的這兩個(gè)協(xié)議,
# 那么比較類的類型就是一個(gè)鴨子類型
# 當(dāng)代碼執(zhí)行中如果執(zhí)行到對(duì)象和這個(gè)類進(jìn)行 isinstance 類型判斷時(shí)會(huì)走到這個(gè)函數(shù)進(jìn)行判斷
for method in ('Swimming', 'Walk'):
for B in C.__mro__:
if method in B.__dict__:
if B.__dict__[method] is None:
return NotImplemented
break
else:
return NotImplemented
return True
# 狗類
class Dog(object):
# 實(shí)現(xiàn)swimming 協(xié)議
def Swimming(self):
print("狗會(huì)狗刨")
# 實(shí)現(xiàn)walk 協(xié)議
def Walk(self):
print("狗會(huì)走路")
def Eat(self):
print("狗喜歡吃骨頭")
# 烏龜類
class Tortoise(object):
# 實(shí)現(xiàn)swimming 協(xié)議
def Swimming(self):
print("烏龜會(huì)潛水")
# 實(shí)現(xiàn)walk 協(xié)議
def Walk(self):
print("烏龜會(huì)走路")
def Eat(self):
print("烏龜喜歡吃魚")
dog = Dog()
tortoise = Tortoise()
print(isinstance(dog, Dock)) # True
print(isinstance(tortoise, Dock)) # True
可以看到,在上面的代碼中,只要實(shí)現(xiàn)了 Dock 類中的 swimming 和 Walk 方法,那么這個(gè)類就可以被叫做 Dock 類
應(yīng)用場(chǎng)景 如: for 循環(huán), 在python 中 for 循環(huán)只能用于可迭代對(duì)象, 那么, 我自己定義的類實(shí)現(xiàn)了 __iter__協(xié)議(接口),這個(gè)實(shí)例類就是一個(gè)可迭代對(duì)象,可以被for 循環(huán)使用
python 中定義協(xié)議類協(xié)議使用 @abstractmethod 裝飾器,@abstractmethod 裝飾過(guò)的類是不能進(jìn)行初始化的,相對(duì)于c++中的純虛函數(shù)類
這個(gè)類只能當(dāng)做協(xié)議(接口)類
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
python詳解如何通過(guò)sshtunnel pymssql實(shí)現(xiàn)遠(yuǎn)程連接數(shù)據(jù)庫(kù)
為了安全起見,很多公司服務(wù)器數(shù)據(jù)庫(kù)的訪問(wèn)多半是要做限制的,由專門的DBA管理,而且都是做的集群,數(shù)據(jù)庫(kù)只能內(nèi)網(wǎng)訪問(wèn),所以就有一個(gè)直接的問(wèn)題是,往往多數(shù)時(shí)候,在別的機(jī)器上(比如自己本地),是不能訪問(wèn)數(shù)據(jù)庫(kù)的,給日常開發(fā)調(diào)試造成了很大不便2021-10-10
Python程序中使用SQLAlchemy時(shí)出現(xiàn)亂碼的解決方案
這篇文章主要介紹了Python程序中使用SQLAlchemy時(shí)出現(xiàn)亂碼的解決方案,SQLAlchemy是Python常用的操作MySQL數(shù)據(jù)庫(kù)的工具,需要的朋友可以參考下2015-04-04
使用python+whoosh實(shí)現(xiàn)全文檢索
今天小編就為大家分享一篇使用python+whoosh實(shí)現(xiàn)全文檢索,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
Python虛擬環(huán)境的創(chuàng)建和使用詳解
這篇文章主要給大家介紹了關(guān)于Python虛擬環(huán)境的創(chuàng)建和使用的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Python數(shù)據(jù)結(jié)構(gòu)之遞歸可視化詳解
遞歸函數(shù)是直接調(diào)用自己或通過(guò)一系列語(yǔ)句間接調(diào)用自己的函數(shù)。遞歸在程序設(shè)計(jì)有著舉足輕重的作用,在很多情況下,借助遞歸可以優(yōu)雅的解決問(wèn)題。本文主要介紹了如何利用可視化方式來(lái)了解遞歸函數(shù)的執(zhí)行步驟,需要的可以參考一下2022-04-04

