如何在python中使用不同的参数编写同名方法

Ein*_*nar 8 python methods function parameter-passing python-3.x

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

我有一个python程序,我在其中创建一个personObject并将其添加到列表中.

p = Person("John")
list.addPerson(p)
Run Code Online (Sandbox Code Playgroud)

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

list.addPerson("John")
Run Code Online (Sandbox Code Playgroud)

addPerson方法将能够区分我是否发送Person-object或String.

在Java中,我将创建两个单独的方法,如下所示:

void addPerson(Person p) {
    //Add person to list
}

void addPerson(String personName) {
    //Create Person object
    //Add person to list
}
Run Code Online (Sandbox Code Playgroud)

我无法在Python中找到如何做到这一点.我知道一个type()函数,我可以用它来检查参数是String还是Object.然而,这对我来说似乎很混乱.还有另一种方法吗?

编辑:

我想替代解决方法将是这样的(python):

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
Run Code Online (Sandbox Code Playgroud)

但与Java中的重载解决方案相比,它看起来很混乱.

Lor*_*chi 7

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

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)
Run Code Online (Sandbox Code Playgroud)

结果将是:

$ python test.py
[foo, bar]
Run Code Online (Sandbox Code Playgroud)

(你需要先安装multimethod)


Cor*_*man 1

我用来实现这种特定模式的一种常见方法是这样的:

def first(self, person):
    try:
        person = Person(person)
    except ConstructionError as e:
        pass
    # Do your thing
Run Code Online (Sandbox Code Playgroud)

我不知道这是否适合你。如果您使用Person现有的Person. 如果是类似的东西可能会更好person_factory,因为如果它已经是一个人,它可以只返回现有的对象,而不是抛出异常。

多方法在 Python 中只是不同而已;Python 可以让你实现几乎任何你想要的语义接口,但代价是在某个地方进行额外的工作,并且你通常可以移动这个“地方”以最好地隐藏它。

另外...这样做还有一些优点...您有时会在 C++、C# 和 Java 中看到如下内容:

 int sum(int a, int b) {
     return (a+b)
 }

 float sum (float a, float b) {
     return (a+b)
 }
 etc.
Run Code Online (Sandbox Code Playgroud)

它可以在 Python 中替换为

 def sum(a,b):
      return a+b
Run Code Online (Sandbox Code Playgroud)

(尽管auto据我所知,C++ 和 C# 现在也可以处理类似的事情)。