我的问题的简化版本:我想在python中编写一个方法,它接受一个参数,一个字符串列表或我的自定义对象,它包含一个字符串列表。然后返回列表的大小。该方法专门针对用户进行调用,因此我希望它对用户来说简单(基本上我不希望两种方法做同样的事情,除了一行代码而且我不想要导入非python标准库)
我意识到在python中不可能像在Java中那样进行重载。
有什么好办法可以解决这个问题/标准方法是什么?我想到的解决方案是:
写两种不同的方法。 使用两个参数和默认值编写一个方法,检查默认值是否相应移动。 用一个参数写一个方法,检查传入的对象类型,相应地移动(不完全确定是否可以进行类型检查)
从设计的角度来看,如果我想要处理的每种类型的对象的语句从长远来看似乎不太好,但我没有看到任何其他解决方案(除了单独的方法)
感谢您的建议!
答案 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