例如我有
class A:
def f(self, x, y, z):
# do something with x, y, z
是否可以在不重新键入“self,x,y,z”的情况下覆盖 f。基本上我有一个带有 10 个参数的函数的类,并打算让许多类扩展它,所以我不想每次都输入参数。请不要只告诉我传递所有参数的列表/字典。
不可以。如果您希望被覆盖的函数具有相同的参数,则需要键入相同的参数。您可以覆盖它以具有不同的参数,因此无法神奇地知道您希望它具有相同的参数。
避免这种情况的唯一方法是使用*args
and/or **kwargs
,但您似乎在说您不想这样做。(此外,这与使用正确参数实际定义函数并不完全相同,如果您使用错误的参数调用会引发错误的位置/时间。)
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)