gpt4 book ai didi

python - Python 中的重载方法(解决方法)

转载 作者:行者123 更新时间:2023-12-01 02:45:23 25 4
gpt4 key购买 nike

我的问题的简化版本:我想在 python 中编写一种方法,该方法接受一个参数,可以是字符串列表,也可以是包含字符串列表的自定义对象。然后返回列表的大小。该方法是专门供用户调用的,所以我希望它对用户来说很简单(本质上我不希望两个方法做同样的事情,除了一行代码,而且我不想导入非 python标准库)

我意识到重载在 python 中是不可能的,就像在 Java 中一样。

什么是解决这个问题的好方法/标准方法是什么?我想到的解决方案是:

编写两个不同的方法。编写一种具有两个参数和默认值的方法,检查默认值是否相应移动。写一个方法一个参数,检查传入的是什么类型的对象,进行相应的移动(不完全确定这种类型检查是否可行)

从设计的角度来看,我想要处理的每种类型的对象的 if 语句从长远来看似乎不太好,但我没有看到任何其他解决方案(除了单独的方法)

感谢您的建议!

最佳答案

在 python 中,您使用 single dispatch函数根据参数类型(特别是第一个参数的类型)建立具有不同实现的单个方法。

from functools import singledispatch

@singledispatch
def process_str_list(str_list):
raise NotImplementedError

@process_str_list.register(list)
def _(str_list):
# process raw list of strings

@process_str_list.register(MyStrListClass)
def _(str_list)
# process my object

要调用该函数,只需使用原始列表或对象调用 process_str_list 即可。类型确定和实现复用在内部进行。

编辑:只是想添加 PEP that introduced single dispatch说:

It is currently a common anti-pattern for Python code to inspect the types of received arguments, in order to decide what to do with the objects.

单次调度是实现该行为的 Python 方式。

关于python - Python 中的重载方法(解决方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45312321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com