Python中的重载方法(变通方法)
我的问题的简化版本:我想用python编写一个方法,它接受一个参数,要么是字符串列表,要么是保存字符串列表的自定义对象。然后返回列表的大小。该方法是专门为用户调用的,因此我希望它对用户来说很简单(基本上,除了一行代码之外,我不希望两个方法做完全相同的事情,我不希望导入非python标准库) 我意识到python中不可能像Java中那样实现重载 做这件事的好方法是什么/标准方法是什么?我想到的解决办法是: 写两种不同的方法。 编写一个包含两个参数和默认值的方法,检查默认值是否相应移动。 使用一个参数编写一个方法,检查传入的对象类型,并相应地移动(不完全确定是否可以进行此类型检查) 从设计的角度来看,我想要处理的每种类型的对象的if语句从长远来看似乎都不是很好,但我没有看到任何其他解决方案(除了单独的方法) 谢谢你的建议 在python中,可以使用一个函数根据参数类型(特别是第一个参数的类型)建立一个具有不同实现的方法 要调用该函数,只需使用原始列表或对象调用Python中的重载方法(变通方法),python,python-2.7,python-3.x,overloading,Python,Python 2.7,Python 3.x,Overloading,我的问题的简化版本:我想用python编写一个方法,它接受一个参数,要么是字符串列表,要么是保存字符串列表的自定义对象。然后返回列表的大小。该方法是专门为用户调用的,因此我希望它对用户来说很简单(基本上,除了一行代码之外,我不希望两个方法做完全相同的事情,我不希望导入非python标准库) 我意识到python中不可能像Java中那样实现重载 做这件事的好方法是什么/标准方法是什么?我想到的解决办法是: 写两种不同的方法。 编写一个包含两个参数和默认值的方法,检查默认值是否相应移动。 使用一个参
process\u str\u list
。类型确定和实现多路复用在内部进行
编辑:只想补充一句,上面写着:
Python代码目前常用的反模式是检查接收到的参数类型,以决定如何处理对象
单一分派是处理该行为的python方法。正如alfasin所建议的,您可以为您的对象实现一个
\uu len\uu
函数
class A(object):
def __init__(self, mylist):
self.mylist = mylist
def __len__(self):
return len(self.mylist)
对于更复杂的区别,您可以在功能级别使用isinstance
:
def myfunction(obj):
if isinstance(obj, list):
# when the object is a list
elif isinstance(obj, MyClass):
# when the object is something else
else:
raise ValueError('wrong type!')
您可以创建不同的对象,并以您想要的方式在其中的每一个对象中实现。同意@alfasin,如果您可以依赖,重载通常是不必要的。只要在你的类中实现
\uuu len\uuu
,然后传入哪种类型就不重要了。我想说duck-typing
是处理这种行为的python方法<代码>@singledispatch仅添加在3.4
中。
def myfunction(obj):
if isinstance(obj, list):
# when the object is a list
elif isinstance(obj, MyClass):
# when the object is something else
else:
raise ValueError('wrong type!')