Python:将类实例传递给外部函数

时间:2018-06-14 21:42:10

标签: python python-3.x

我遇到过一个python项目,它通常从类方法调用外部函数,并将类实例和其他一些参数传递给外部函数。

使用的方法显示在下面的method_one中,之前我从未遇到过这种实现。使用locals获取本地方法参数和self类实例似乎很奇怪。然后代码依赖于正确命名的字典键,即与外部函数(some_function)的参数相同。

对我来说,明显的,更简单的直接替代方案是method_two,但即便如此,我也不愿意

  1. 使some_function成为ExampleClass1的方法,以便它可以直接访问自己,或
  2. 仅将ExampleClass1实例的必需属性传递给some_function
  3. 示例代码:

    class ExampleClass1(object):
        def __init__(self, something):
            self.something = something
    
        def method_one(self, param_1, param_2):
            all_params = locals()
            all_params['example_self'] = all_params.pop('self')
            some_function(**all_params)
    
        def method_two(self, param_1, param_2):
            some_function(self, param_1, param_2)
    
    
    def some_function(example_self, param_1, param_2):
        print(example_self.something, param_1, param_2)
    
    
    e = ExampleClass1("do")
    e.method_one(1, "a")
    e.method_two(2, "b")
    

    所以,

    1. 有没有理由使用我不知道的method_one
    2. 您如何针对这种情况提供有关最佳做法的建议?

1 个答案:

答案 0 :(得分:1)

self作为参数传递给外部函数是一种完全标准的做法。我有点不清楚为什么使用locals()的调用以及为什么键被改组,但这是一个单独的问题。一般来说,我发现如果您使用的是locals(),那么您编写的代码中的9次可能会更简单。元编程是一个值得注意的例外,这是另一个话题。

我使用它的一个例子是当你想将代码分成几个模块而不是一个带有一堆方法的大类时。组织代码有很多种方法,但我使用的一种方法是根据域的功能将函数分离到其他模块,然后将self传递给这些函数供其使用。

具体示例:接受请求的服务器对象可以将处理这些请求的路由置于其他位置,然后将实际业务逻辑委派给外部路由功能。但是,如果这些路由需要服务器对象,那么您可能希望将self(作为服务器)传递给它们。你可以做一个参数,他们应该只是方法,但这是代码风格的问题,并且在很大程度上取决于确切的用例。

一般情况下,如果使用得当,通过self并不是一种不好的做法。