在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)