Python 在不重新输入函数参数的情况下覆盖函数/方法

Posted

技术标签:

【中文标题】Python 在不重新输入函数参数的情况下覆盖函数/方法【英文标题】:Python override a function/method without retyping function arguments 【发布时间】:2012-11-10 10:33:46 【问题描述】:

例如我有

class A:
    def f(self, x, y, z):
        # do something with x, y, z

是否可以在不重新输入 "self, x, y, z" 的情况下覆盖 f。基本上我有一个带有 10 个参数的函数的类,并且打算让许多类扩展它,所以我不想每次都输入参数。请不要只告诉我传递所有参数的列表/字典。

【问题讨论】:

根据你的问题pass a list/dictionary of all the arguments有什么问题 您的代码示例没有任何覆盖。也许你可以介绍一个class B(A) 让你的问题更清楚。 【参考方案1】:

没有。如果您希望被覆盖的函数具有相同的参数,则需要键入相同的参数。您可以覆盖它以具有不同的参数,因此无法神奇地知道您希望它具有相同的参数。

避免这种情况的唯一方法是使用*args 和/或**kwargs,但您似乎在说您不想这样做。 (此外,这与使用正确参数实际定义函数并不完全相同,就在使用错误参数调用时引发错误的位置/时间而言。)

【讨论】:

【参考方案2】:
class A:
    def facade_f(self, x, y, z):
        self._real_f('x': x, 'y': y, 'z': z)

    def _real_f(self, params):
        # do something with params['x'], params['y'], params['z']

class B(A):
    def _real_f(self, params):
        # do something with params['x'], params['y'], params['z']

这不是真正的重写,但是您公开了一个带有所有命名参数的漂亮接口,可以在facade_f 方法中检查它们的类型和值,并且在扩展它时仍然很少输入。

工作示例:

class A:
    def facade_f(self, x, y, z):
        self._real_f('x': x, 'y': y, 'z': z)

class B(A):
    def _real_f(self, params):
        print params['x'], params['y'], params['z']

B().facade_f(1, 2, 3)

【讨论】:

以上是关于Python 在不重新输入函数参数的情况下覆盖函数/方法的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不详尽检查函数体中的每个参数的情况下缩小重载参数的类型?

python 函数参数

XCode 显示函数参数热键

在外部覆盖 python 模块函数

如何在不重新绑定 this 的情况下返回一个带有粗箭头函数的对象? [复制]

是否有一个 R 函数用于在不使用循环的情况下根据另一列的修改版本重新编码列?