Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的重载方法(变通方法)_Python_Python 2.7_Python 3.x_Overloading - Fatal编程技术网

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

Python中的重载方法(变通方法),python,python-2.7,python-3.x,overloading,Python,Python 2.7,Python 3.x,Overloading,我的问题的简化版本:我想用python编写一个方法,它接受一个参数,要么是字符串列表,要么是保存字符串列表的自定义对象。然后返回列表的大小。该方法是专门为用户调用的,因此我希望它对用户来说很简单(基本上,除了一行代码之外,我不希望两个方法做完全相同的事情,我不希望导入非python标准库) 我意识到python中不可能像Java中那样实现重载 做这件事的好方法是什么/标准方法是什么?我想到的解决办法是: 写两种不同的方法。 编写一个包含两个参数和默认值的方法,检查默认值是否相应移动。 使用一个参

我的问题的简化版本:我想用python编写一个方法,它接受一个参数,要么是字符串列表,要么是保存字符串列表的自定义对象。然后返回列表的大小。该方法是专门为用户调用的,因此我希望它对用户来说很简单(基本上,除了一行代码之外,我不希望两个方法做完全相同的事情,我不希望导入非python标准库)

我意识到python中不可能像Java中那样实现重载

做这件事的好方法是什么/标准方法是什么?我想到的解决办法是:

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

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

谢谢你的建议

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

要调用该函数,只需使用原始列表或对象调用
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!')