在Python中重写两个方法

时间:2012-05-11 16:45:01

标签: python polymorphism

想象一下,我有以下两种方法:

 def function(self, my_object):
     self.things.add(my_object)

 def function_args(self, arg1, arg2, arg3 = None):
     my_object = MyObject(arg1, arg2, arg3)
     self.things.add(my_object)

我想把它写成一个可以用位置参数调用的单个函数:

 something.function(an_object)
 something.function(arg1, arg2, arg3)

如果我愿意总是用关键字参数调用结果函数,我可以看到如何做到这一点,如果我愿意更改第二个函数的签名以接受列表,我可以看到如何做到这一点或三个参数的元组,以便每个版本都有单个参数,我可以按类型区分(在Python中似乎不太正确)。

我可以干净地编写一个允许我用一组位置参数调用它的函数吗?

4 个答案:

答案 0 :(得分:1)

为什么不将arg2设置为可选项并在调用该函数时检查它?

 def function_args(self, arg1, arg2 = None, arg3 = None):
     if arg2 != None:
       my_object = MyObject(arg1, arg2, arg3)
       self.things.add(my_object)
     else:
       self.things.add(arg1)

答案 1 :(得分:1)

我不会把这个想法称为非常pythonic,但这样的事情会起作用:

def fun(*args):
    obj = args[0]
    if not isinstance(obj, MyClass):
        obj = MyClass(*args)

我们不知道您的API是什么,但由于您在评论中提到了对象重用,或许您可以让它对最终用户透明,例如:

def fun(arg1, arg2, arg3=None):
    key = arg1 + arg2 + arg3
    if key not in cache:
        cache[key] = MyClass(arg1, arg2, arg3)
    obj = cache[key]
    ...

答案 2 :(得分:0)

def function(self, *args, my_object=None)
    if my_object is None:
        my_object =  MyObject(*args)
    self.things.add(my_object)

这要求你传递my_object作为关键字参数,但是IMO这正是你想要的,因为它提示了所涉及的魔法。

如果你真的不想要关键字参数,请删除它,并检查len(args)是否有分支。

答案 3 :(得分:0)

  

我可以干净地编写一个允许我用一组位置参数调用它的函数吗?

我不这么认为。但这是另一个尝试接近的事情。

def fn(self, a, *args):
    if args:
        self.things.add(MyObject(*((a,) + args)))
    else:
        self.things.add(a)