當前位置:
首頁 > 知識 > 使用 singledispatch 在 Python 中追溯地添加方法

使用 singledispatch 在 Python 中追溯地添加方法

使用 singledispatch 在 Python 中追溯地添加方法


在我們覆蓋 7 個 PyPI 庫的系列文章中了解更多解決 Python 問題的信息。

-- Moshe Zadka(作者)

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 代碼測試的工具。


回顧本系列的前幾篇文章:

  • Cython
  • Black
  • attrs

via: https://opensource.com/article/19/5/python-singledispatch

作者: Moshe Zadka 選題: lujun9972 譯者: geekpi 校對: wxy

本文由 LCTT 原創編譯, Linux中國 榮譽推出


點擊「了解更多」可訪問文內鏈接

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux技術 的精彩文章:

使用 Python 構建可擴展的社交媒體情感分析服務
每日安全資訊:Mozilla 為 Firefox 上周的 bug 致歉

TAG:Linux技術 |