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 |
我不知道这是否对你有用。如果您使用现有的
在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)。