python - Python:将类实例传递给外部函数
问题描述
我遇到了一个 python 项目,它通常从类方法调用外部函数并将类实例和一些其他参数传递给外部函数。
使用的方法如下method_one
所示,我以前从未遇到过这种实现。至少可以说,使用 locals 来获取本地方法参数和self
类实例似乎很奇怪。然后,代码依赖于正确命名的字典键,即与外部函数 ( some_function
) 的参数相同。
对我来说,显而易见的、更简单的直接替代方案是,method_two
但即使如此,我更愿意
- 制作
some_function
一种方法,ExampleClass1
使其可以直接访问自我,或 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")
所以,
- 有什么理由使用
method_one
我不知道的吗? - 对于这种情况,您将如何就最佳实践提供建议?
解决方案
self
作为参数传递给外部函数是完全标准的做法。我有点不清楚为什么要调用 tolocals()
以及为什么要随机播放键,但这是另一回事。一般来说,我发现如果您使用locals()
,那么您编写的代码有 10 次中有 9 次会更简单。值得注意的例外是元编程,这是另一个主题。
我使用它的一个例子是当你想将代码分成几个模块而不是拥有一个包含一堆方法的大类时。有很多方法可以组织代码,但我使用的一种方法是根据它们的域将函数分离到其他模块,然后传递self
给这些函数供它们使用。
具体示例:接受请求的服务器对象可以将处理这些请求的路由放在其他地方,然后将实际业务逻辑委托给外部路由功能。但是,如果这些路由需要服务器对象,那么您可能希望将self
(作为服务器)传递给它们。您可以提出一个论点,它们应该只是方法,但这是代码风格的问题,并且很大程度上取决于确切的用例。
一般来说,self
如果使用得当,四处走动并不是一个坏习惯。
推荐阅读
- r - 在给定条件的情况下更改列中的行值
- php - Laravel PHP 异步
- c# - 我做了一个列表,想在 mvc5 中显示它,但出现错误。这是代码
- scala - Scalatra - 未找到:对象缩放
- python - Python - 计算存储在列表中的关键字出现在文本中的次数
- mongodb - MongoDB 条件查询取决于可能的日期
- kubernetes-helm - Helm _helpers.yaml 模板,bool 返回 %!S(Bool=True) 而不是字符串
- c++ - 如何在宏中使用私有函数?
- c# - 用于运行进程的 Azure DevOps 管道
- flutter - Flutter 如何将分组数据添加到列表中