Python重写函数/方法而无需重新输入函数参数

时间:2012-11-22 04:03:25

标签: python oop function metaclass

例如我有

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

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

2 个答案:

答案 0 :(得分:4)

没有。如果希望重写的函数具有相同的参数,则需要键入相同的参数。你可以覆盖它以拥有不同的参数,所以没有办法神奇地知道你希望它有相同的参数。

避免这种情况的唯一方法是使用*args和/或**kwargs,但您似乎在说您不想这样做。 (此外,这与使用正确参数定义函数的方式不完全相同,如果使用错误的参数调用,则会在何时/何时引发错误。)

答案 1 :(得分:1)

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)