关于函数:如何在python中使用不同参数编写相同名称的方法

How to write same-name methods with different parameters in python

本问题已经有最佳答案,请猛点这里访问。

我正在从Java背景中学习Python(3。x)。

我有一个python程序,在那里我创建了一个PersonObject并将其添加到一个列表中。

1
2
p = Person("John")
list.addPerson(p)

但是为了灵活性,我还希望能够在addPerson方法中直接声明它,比如:

1
list.addPerson("John")

addPerson方法将能够区分我是否发送Person对象或字符串。

在Java中,我将创建两种不同的方法,如下所示:

1
2
3
4
5
6
7
8
void addPerson(Person p) {
    //Add person to list
}

void addPerson(String personName) {
    //Create Person object
    //Add person to list
}

我不知道如何在python中实现这一点。我知道一个type()函数,可以用它检查参数是字符串还是对象。不过,我觉得这很混乱。还有别的办法吗?

编辑:

我想其他的解决方法应该是这样的(python):

1
2
3
4
5
6
7
8
def addPerson(self, person):
    //check if person is string
        //Create person object

    //Check that person is a Person instance
        //Do nothing

    //Add person to list

但与Java中的超载解决方案相比,这看起来很麻烦。


使用@kevin指向的引用,您可以执行如下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from multimethod import multimethod

class Person(object):
    def __init__(self, myname):
        self.name = myname

    def __str__(self):
        return self.name

    def __repr__(self):
        return self.__str__()


@multimethod(list, object)
def addPerson(l, p):
    l = l +[p]
    return l

@multimethod(list, str)
def addPerson(l, name):
    p = Person(name)
    l = l +[p]
    return l


alist = []
alist = addPerson(alist, Person("foo"))
alist = addPerson(alist,"bar")
print(alist)

结果将是:

1
2
$ python test.py
[foo, bar]

(您需要先安装多方法)


我用来实现这个特定模式的一个常见方法如下:

1
2
3
4
5
6
def first(self, person):
    try:
        person = Person(person)
    except ConstructionError as e:
        pass
    # do your thing

我不知道这是否对你有用。如果您使用现有的Person调用它,那么您希望捕获Person将在此处生成的任何错误。如果这类似于person_factory,可能会更好,因为如果已经是一个人而不是抛出异常,它可以返回现有对象。

在python中,多方法是不同的;python允许你实现你想要的几乎任何类型的语义接口,代价是在某个地方进行额外的工作,并且你通常可以移动到这个"某处"的地方,以便最好地对你隐藏它。

也。。。这样做有好处…在C++和C/Java中,你有时会看到这样的事情:

1
2
3
4
5
6
7
 int sum(int a, int b) {
     return (a+b)
 }
 float sum (float a, float b) {
     return (a+b)
 }
 etc.

在python中可以用

1
2
 def sum(a,b):
      return a+b

(尽管C++和C语言有EDOCX1,3,现在也可以处理类似的事情,AFAIK)。