类 vs Function:如果在 Python 中使用 class,是否需要使用 'self' 关键字?

Classes vs Function: Do I need to use 'self' keyword if using a class in Python?

我有一个数据工程程序,可以从联邦政府网站获取一些数据并转换这些数据。我有点困惑我是否需要使用 'self' 关键字,或者根本不使用 class 是否更好。这是目前的组织方式:

class GetGovtData():

    def get_data_1(arg1=0, arg2=1):
       df = conduct_some_operations
       return df

    def get_data_2(arg1=4, arg2=5):
       df = conduct_some_operations_two
       return df

我在这里主要使用 class 进行组织。例如,我可能需要使用一种 class 中的十几种不同方法。我发现这样更美观/更容易输入:

from data.get_govt_data import GetGovtData

df1 = GetGovtData.get_data_1()
df2 = GetGovtData.get_data_2()

而不是:

from data import get_govt_data

df1 = get_govt_data.get_data_1()
df2 = get_govt_data.get_data_2()

其中只有一大堆下划线。所以我很好奇如果这样使用 class 而不用考虑 'self' 是否会被认为是错误的代码?还是我应该删除 classes 并在我的文件中使用一堆函数?

我想您有一个名为 data/get_govt_data.py 的文件,其中包含您的第一个代码块。如果愿意,您可以将该文件重命名为 data/GetGovtData.py,删除 class 行,根本不用理会 class。然后你可以做

from data import GetGovtData

df1 = GetGovtData.get_data_1()

根据您的设置,您可能需要为 Python 创建一个空文件 data/__init__.py 才能将 data 视为一个模块。

编辑:关于文件命名,Python 在这里没有施加任何太严格的限制。但是请注意,许多项目通常使用 camelCase 或 CapitalCase 来区分函数、class 和模块名称。将大写字母用于模块可能会使其他人一秒钟感到困惑,以为它是 class。如果您不想在项目中使用 classes,您可以选择不遵循此约定。

首先回答标题中的问题:确切的字符串 'self' 是一个约定(我看不出忽略 BTW 的正当理由),但是 class 方法中的第一个参数始终是对 class 实例的引用。

您应该使用 class 还是平面函数取决于函数是否具有共享状态。从您的场景来看,它们可能具有共同的基础 URL、身份验证数据、数据库名称等。也许您甚至需要先建立连接?所有这些最好保存在 class 中,然后在函数中使用。

如果您在 Python class 中开发函数,您可以通过两种方式定义函数:一种以 self 作为第一个参数,另一种不带 self。

那么,两者有什么不同呢?

与自身函数

第一个是方法,它能够访问创建的对象中的内容。这允许您访问单个对象的内部状态,例如,某种计数器。这些是您在使用面向对象编程时通常使用的方法。一个简短的介绍可以是基金 here [External Link]。这些方法要求您创建给定 class.

的新实例

无自函数

无需初始化 class 的实例即可运行。这就是为什么您可以直接在导入的 class.

上调用它们的原因

备选方案

这是基于 Tom K 的评论。除了使用 self,您还可以使用装饰器 @staticmethod 来指示方法在您的 class 中的作用。可以找到更多信息 here [External link].

最后的想法

回答你最初的问题:你不需要使用self。在您的情况下,您不需要自我,因为您不共享对象的内部状态。不过,如果您使用 classes,您应该考虑面向对象的设计。