Python中的重载方法(变通方法)

时间:2017-07-25 19:50:05

标签: python python-2.7 python-3.x overloading

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

我意识到在python中不可能像在Java中那样进行重载。

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

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

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

感谢您的建议!

2 个答案:

答案 0 :(得分:2)

在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说:

  

目前,Python代码检查接收参数的类型是一种常见的反模式,以决定如何处理对象。

单一调度是处理该行为的pythonic方式。

答案 1 :(得分:0)

正如alfasin建议的那样,您可以为对象实现CREATE UNIQUE INDEX [IX_Activities_Identity] ON [Activities] ([Identity]) WHERE [End] IS NULL; 函数;

__len__

对于更复杂的区别,您可以在功能级别使用class A(object): def __init__(self, mylist): self.mylist = mylist def __len__(self): return len(self.mylist)

isinstance