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

栏目: Python · 发布时间: 7年前

内容简介:在我们覆盖 7 个 PyPI 库的系列文章中了解更多解决 Python 问题的信息。Python 是当今使用最多

使用singledispatch在 <a href='https://www.codercto.com/topics/20097.html'>Python</a> 中追溯地添加方法

在我们覆盖 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 代码测试的工具。

【责任编辑:庞桂玉 TEL:(010)68476606】


以上所述就是小编给大家介绍的《使用singledispatch在Python中追溯地添加方法》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

集体智慧编程

集体智慧编程

Toby Segaran / 莫映、王开福 / 电子工业出版社 / 2015-3 / 79.00元

《集体智慧编程》以机器学习与计算统计为主题背景,专门讲述如何挖掘和分析Web 上的数据和资源,如何分析用户体验、市场营销、个人品味等诸多信息,并得出有用的结论,通过复杂的算法来从Web 网站获取、收集并分析用户的数据和反馈信息,以便创造新的用户价值和商业价值。全书内容翔实,包括协作过滤技术(实现关联产品推荐功能)、集群数据分析(在大规模数据集中发掘相似的数据子集)、搜索引擎核心技术(爬虫、索引、查......一起来看看 《集体智慧编程》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

html转js在线工具
html转js在线工具

html转js在线工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具