從介面到型別和抽象類在 OOP 語言(如 python)上的實際區別是什么?
維基百科的鏈接看起來像相同的 介面、型別和抽象類
uj5u.com熱心網友回復:
Python 有鴨子型別:
如果它走路像鴨子,叫起來像鴨子,那它一定是鴨子
這意味著這有效:
class Duck:
def quack(self):
print("quack!")
class Car:
def quack(self):
print("vroum!") # for example purposes
def make_it_quack(something):
something.quack() # don't care what it is, just that it quacks
make_it_quack(Duck()) # quack!
make_it_quack(Car()) # vroum!
Python 在運行時會嘗試呼叫quack物件上的方法,如果不存在則失敗。但是只要方法存在(并且簽名適合),Python 就不會關心物件的實際型別。
在其他語言中,您需要定義兩個子類都必須繼承的基類(可能是abstract )。如果你希望你的物件有多個不同的方法集,要么你1)可以進行多重繼承,2)你構建(抽象)基類的高層次結構,或者3)你創建很多介面。Python不需要任何這些,但它也不為您的代碼型別檢查提供靜態保證。
如果你愿意,有一些方法可以在 Python 中進行更多型別檢查:
- 您可以使用標準庫宣告抽象基類
abc - 您可以在代碼中添加型別注釋并使用外部型別檢查器(例如MyPy)。
TL;DR : Python 是鴨式的,但是如果你想要介面契約附帶的保證,可以使用工具。
uj5u.com熱心網友回復:
閱讀《設計模式》一書,他們解釋說介面是具有公開可用方法的外殼,型別是資料的內部結構,抽象類可能是腳本構建物件時資料所基于的形式,看起來像一種。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/413417.html
標籤:
