Python 定义类函数的好方法,这些类函数都使用不同的参数调用相同的函数

Python 定义类函数的好方法,这些类函数都使用不同的参数调用相同的函数,python,Python,我正在编写一个类,它有一组成员函数,所有这些函数都使用不同的参数调用同一个函数。我现在写的方式是: class ExampleClass: def a_function(self,args): do_something def func1(self): return self.a_function(arg1) def func2(self): return self.a_function(arg2) .

我正在编写一个类,它有一组成员函数,所有这些函数都使用不同的参数调用同一个函数。我现在写的方式是:

class ExampleClass:
    def a_function(self,args):
        do_something

    def func1(self):
        return self.a_function(arg1)

    def func2(self):
        return self.a_function(arg2)
        .
        .
        .  

这似乎是令人难以置信的冗余,而且是一个很难处理的问题,因为它占用了太多的空间。这是处理所有具有相同结构的类函数的最佳方法,还是有更好的方法来处理这一问题?

因为函数是Python中的第一类对象,所以可以在另一个对象中创建并返回一个对象。这意味着您可以定义一个helper函数,并在类中使用它来消除一些样板代码:

class ExampleClass:
    def a_function(self, *args):
        print('do_something to {}'.format(args[0]))

    def _call_a_function(arg):
        def func(self):
            return self.a_function(arg)
        return func

    func1 = _call_a_function(1)
    func2 = _call_a_function(2)
    func3 = _call_a_function(3)


if __name__ == '__main__':
    example = ExampleClass()
    example.func1() # -> do_something to 1
    example.func2() # -> do_something to 2
    example.func3() # -> do_something to 3
如果您使用的是较新版本的Python,您甚至不必编写helper函数,因为有一个名为:


因为函数是Python中的第一类对象,所以可以在另一个对象中创建并返回一个对象。这意味着您可以定义一个helper函数,并在类中使用它来消除一些样板代码:

class ExampleClass:
    def a_function(self, *args):
        print('do_something to {}'.format(args[0]))

    def _call_a_function(arg):
        def func(self):
            return self.a_function(arg)
        return func

    func1 = _call_a_function(1)
    func2 = _call_a_function(2)
    func3 = _call_a_function(3)


if __name__ == '__main__':
    example = ExampleClass()
    example.func1() # -> do_something to 1
    example.func2() # -> do_something to 2
    example.func3() # -> do_something to 3
如果您使用的是较新版本的Python,您甚至不必编写helper函数,因为有一个名为:



为什么不将参数作为参数传递给方法
def func1(self,some_arg):返回self.a_函数(some_arg)
甚至直接访问
a_函数。多个方法的目的是什么?我不想让使用这个类的人知道他们需要传递什么参数来调用“a_函数”,我不理解你的用例。为什么在你的设计中有这个额外的层?似乎对
obj.func1
的任何调用都应该被
a_函数
等价物替换。我明白OP的意思是“我不想让使用这个类的人知道…”。这是有道理的。但在这种情况下,您的目标是为用户提供单独的func1、func2等,可能是使用非常直观的函数名。所以我看不出有任何方法可以避免单独定义它们为什么不将参数作为参数传递给方法
def func1(self,some_arg):返回self.a_函数(some_arg)
甚至直接访问
a_函数。多个方法的目的是什么?我不想让使用这个类的人知道他们需要传递什么参数来调用“a_函数”,我不理解你的用例。为什么在你的设计中有这个额外的层?似乎对
obj.func1
的任何调用都应该被
a_函数
等价物替换。我明白OP的意思是“我不想让使用这个类的人知道…”。这是有道理的。但在这种情况下,您的目标是为用户提供单独的func1、func2等,可能是使用非常直观的函数名。所以我看不出你可以避免单独定义它们,我只是想提出这个想法。这是处理标准设计模式的一种方法吗?在我看来,
a_函数
做得太多了。@roganjosh:不知道你所说的“标准设计模式”是什么意思,也不知道
a_函数
做得太多了。创建一个封装了重复处理序列的函数是一个“设计模式”,这一模式由来已久。在Python中也有其他的实现方法,我只是选择了我认为最明显的方法。所有这些helper方法最终调用同一个方法,但参数不同,这一事实向我表明,
a_函数
做了很多不同的事情。如果没有,您肯定会直接公开它,并解释它如何处理不同的输入。然后,函数应根据其输入调用不同的函数。我所设想的是,
一个函数
有一个巨大的主体,它可以处理自身的所有不同功能。@roganjosh:
调用函数()
函数只有一个目的。关于
a_function()
本身很难说,除了它显然接受一个参数,这个参数可以有不同的值,这是非常非常常见的,一般来说,它不能表明接受它的函数中会发生多少或什么样的处理。我正要提出这个想法。这是处理标准设计模式的一种方法吗?在我看来,
a_函数
做得太多了。@roganjosh:不知道你所说的“标准设计模式”是什么意思,也不知道
a_函数
做得太多了。创建一个封装了重复处理序列的函数是一个“设计模式”,这一模式由来已久。在Python中也有其他的实现方法,我只是选择了我认为最明显的方法。所有这些helper方法最终调用同一个方法,但参数不同,这一事实向我表明,
a_函数
做了很多不同的事情。如果没有,您肯定会直接公开它,并解释它如何处理不同的输入。然后,函数应根据其输入调用不同的函数。我所设想的是,
一个函数
有一个巨大的主体,它可以处理自身的所有不同功能。@roganjosh:
调用函数()
函数只有一个目的。很难说什么
a_function()
本身,除了它显然接受一个可能有不同值的参数之外,这是非常非常常见的,通常不表明接受它的函数中会发生多少或什么样的处理。