首页 > 解决方案 > Python:将类实例传递给外部函数

问题描述

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

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

对我来说,显而易见的、更简单的直接替代方案是,method_two但即使如此,我更愿意

  1. 制作some_function一种方法,ExampleClass1使其可以直接访问自我,或
  2. ExampleClass1仅将实例的必需属性传递给some_function.

示例代码:

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. 对于这种情况,您将如何就最佳实践提供建议?

标签: pythonpython-3.x

解决方案


self作为参数传递给外部函数是完全标准的做法。我有点不清楚为什么要调用 tolocals()以及为什么要随机播放键,但这是另一回事。一般来说,我发现如果您使用locals(),那么您编写的代码有 10 次中有 9 次会更简单。值得注意的例外是元编程,这是另一个主题。

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

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

一般来说,self如果使用得当,四处走动并不是一个坏习惯。


推荐阅读