Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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_Polymorphism - Fatal编程技术网

在Python中将两个方法重写为一个

在Python中将两个方法重写为一个,python,polymorphism,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(

假设我有以下两种方法:

 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中似乎不太正确)


我能干净利落地编写一个函数,允许我使用任意一组位置参数调用它吗?

为什么不将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)
这要求您将my_对象作为关键字参数传递,但在我看来,这正是您想要的,因为它为所涉及的魔力提供了一个提示


如果确实不需要关键字参数,请删除它,并检查len(args)是否存在分支。

我不认为这个想法很像python,但类似的方法可以奏效:

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]
    ...
我能干净利落地编写一个函数,允许我用任意一组位置参数调用它吗

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

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

为什么要使用第二个函数?调用者不能构造对象吗?当然可以,我在内部代码中就是这样做的。但是,这个库也会被其他程序员使用,因为对他们来说,内部对象的细节是不必要的细节。我想提供一个更简单的界面(在维护使用预构造对象的接口时,因为在某些情况下,我会反复重用单个实例)。使用关键字参数。说真的。当Guido说“显式优于隐式”时,关键字参数正是他所说的。“显式优于隐式。”-PEP20 maxim不是一个意外,作为您库的作者和读者,我更愿意称之为一个或另一个。如果MyObject是一个实现细节,那么请对我隐藏它。我完全同意@msw,但由于某些情况可能并且确实会出现过载使生活更简单的情况,这一点已经讨论过了。有一些有效的方法这里的ial解决方案:OP声明他不想使用关键字参数。哦,没有看到。无论如何,我仍然认为他应该。
def fn(self, a, *args):
    if args:
        self.things.add(MyObject(*((a,) + args)))
    else:
        self.things.add(a)