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

Python重写函数/方法而不重新键入函数参数

Python重写函数/方法而不重新键入函数参数,python,oop,function,metaclass,Python,Oop,Function,Metaclass,比如我有 class A: def f(self, x, y, z): # do something with x, y, z 是否可以在不重新键入self、x、y、z的情况下覆盖f。基本上,我有一个带有10个参数的函数的类,并且打算让许多类扩展它,所以我不希望每次都键入参数。请不要只告诉我传递所有参数的列表/字典。否。如果希望重写的函数具有相同的参数,则需要键入相同的参数。您可以覆盖它,使其具有不同的参数,因此无法神奇地知道您希望它具有相同的参数 class A:

比如我有

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

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

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

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']

避免这种情况的唯一方法是使用*args和/或**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']
避免这种情况的唯一方法是使用*args和/或**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\u 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)
它不是真正的重写,但是您公开了一个包含所有命名参数的漂亮接口,可以在facade\u 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)

根据您的问题传递所有参数的列表/字典是否有任何问题?您的代码示例没有任何重写。也许你可以引入一个BA类来让你的问题更清楚。根据你的问题传递所有参数的列表/字典有问题吗?你的代码示例没有任何重写。也许你可以介绍一门BA课程,让你的问题更清楚。