使用 singledispatch 在 Python 中追溯地新增方法
在我們覆蓋 7 個 PyPI 庫的系列文章中瞭解更多解決 Python 問題的資訊。
Python 是當今使用最多流行的程式語言之一,因為:它是開源的,它具有廣泛的用途(例如 Web 程式設計、業務應用、遊戲、科學程式設計等等),它有一個充滿活力和專注的社群支援它。這個社群是我們在 Python Package Index(PyPI)中提供如此龐大、多樣化的軟體包的原因,用以擴充套件和改進 Python。並解決不可避免的問題。
在本系列中,我們將介紹七個可以幫助你解決常見 Python 問題的 PyPI 庫。今天,我們將研究 singledispatch,這是一個能讓你追溯地向 Python 庫新增方法的庫。
singledispatch
想象一下,你有一個有 Circle、Square 等類的“形狀”庫。
Circle 類有半徑、Square 有邊、Rectangle 有高和寬。我們的庫已經存在,我們不想改變它。
然而,我們想給庫新增一個面積計算。如果我們不會和其他人共享這個庫,我們只需新增 area
方法,這樣我們就能呼叫 shape.area()
而無需關心是什麼形狀。
雖然可以進入類並新增一個方法,但這是一個壞主意:沒有人希望他們的類會被新增新的方法,程式會因奇怪的方式出錯。
相反,functools 中的 singledispatch
函式可以幫助我們。
@singledispatch
def get_area(shape):
raise NotImplementedError("cannot calculate area for unknown shape",
shape)
get_area
函式的“基類”實現會報錯。這保證瞭如果我們出現一個新的形狀時,我們會明確地報錯而不是返回一個無意義的結果。
@get_area.register(Square)
def _get_area_square(shape):
return shape.side ** 2
@get_area.register(Circle)
def _get_area_circle(shape):
return math.pi * (shape.radius ** 2)
這種方式的好處是如果某人寫了一個匹配我們程式碼的新形狀,它們可以自己實現 get_area
。
from area_calculator import get_area
@attr.s(auto_attribs=True, frozen=True)
class Ellipse:
horizontal_axis: float
vertical_axis: float
@get_area.register(Ellipse)
def _get_area_ellipse(shape):
return math.pi * shape.horizontal_axis * shape.vertical_axis
呼叫 get_area
很直接。
print(get_area(shape))
這意味著我們可以將大量的 if isintance()
/elif isinstance()
的程式碼以這種方式修改,而無需修改介面。下一次你要修改 if isinstance,你試試 `singledispatch!
在本系列的下一篇文章中,我們將介紹 tox,一個用於自動化 Python 程式碼測試的工具。
回顧本系列的前幾篇文章:
via: https://opensource.com/article/19/5/python-singledispatch
作者:Moshe Zadka 選題:lujun9972 譯者:geekpi 校對:wxy
訂閱“Linux 中國”官方小程式來檢視
相關文章
- 在 Linux 中把使用者新增到組的四個方法Linux
- Java中在迭代時新增元素的3種方法Java
- JSON在Python中的使用JSONPython
- reload在python中的使用Python
- python中的特殊方法使用Python
- Python中sort()方法的使用Python
- Python中reversed()方法如何使用?Python
- WWDC 2018:在Swift中如何高效地使用集合Swift
- 【Android】在Kotlin中更優雅地使用LiveDataAndroidKotlinLiveData
- input在python中的使用注意Python
- sqlalchemy在python中的使用(基本使用)一SQLPython
- 在Python中使用代理IP的方法詳解Python
- Python の 在 VSCode 中使用 IPython Kernel 的方法PythonVSCode
- python中list的各種方法使用Python
- range方法在Python2和Python3中的不同Python
- Python列表中新增元素的常用方法!Python
- AES演算法在Python中的使用演算法Python
- 使用 Beautiful Soup 在 Python 中抓取網頁Python網頁
- Python 中__new__方法詳解及使用Python
- Python中zip函式的使用方法Python函式
- Python中類的建立和使用方法Python
- python 中字典dict如何新增元素?Python
- python變數中self的新增Python變數
- 在Linux中,如何新增一個使用者到特定的組?Linux
- Hanlp在ubuntu中的使用方法介紹HanLPUbuntu
- Mock 在 Python 單元測試中的使用MockPython
- LRTimelapse可以在 Lightroom / ACR 中安全地使用哪些開發工具?OOM
- Python列表中set函式的使用方法!Python函式
- python中time庫的例項使用方法Python
- Python中操作時間之strptime()方法的使用Python
- Python中如何使用構造方法定義類Python構造方法
- 在VS中新增lib庫的三種方法
- 在pom檔案中新增jar包的方法JAR
- ES6中物件新增的方法物件
- 《我的世界》中國內地註冊使用者達4億 今年新增1億使用者
- sqlalchemy在python中的使用(關於查詢)二SQLPython
- Python爬蟲之路-chrome在爬蟲中的使用Python爬蟲Chrome
- Python爬蟲之路-selenium在爬蟲中的使用Python爬蟲