类与函数:如果在 Python 中使用类,我是否需要使用“self”关键字?

Rag*_*rok 0 python class function object self

我有一个数据工程程序,它从联邦政府网站上获取一些数据并转换这些数据。我对是否需要使用“self”关键字或者根本不使用类是否更好的做法感到有些困惑。这是它目前的组织方式:

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
Run Code Online (Sandbox Code Playgroud)

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

from data.get_govt_data import GetGovtData

df1 = GetGovtData.get_data_1()
df2 = GetGovtData.get_data_2()
Run Code Online (Sandbox Code Playgroud)

而不是:

from data import get_govt_data

df1 = get_govt_data.get_data_1()
df2 = get_govt_data.get_data_2()
Run Code Online (Sandbox Code Playgroud)

其中只有一大堆下划线。所以我很好奇使用这样的类是否会被认为是糟糕的代码,而不用担心“自我”?或者我应该消除这些类并在我的文件中使用一堆函数?

mpS*_*der 5

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

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

功能与自我

第一个是方法,它能够访问所创建对象中的内容。这允许您访问单个对象的内部状态,例如某种类型的计数器。这些是您在使用面向对象编程时通常使用的方法。一个简短的介绍可以在这里 [外部链接]资金。这些方法要求您创建给定类的新实例。

没有自我的功能

无需初始化类实例的函数。这就是为什么您可以在导入的类上直接调用它们的原因。

替代方案

这是基于 Tom K 的评论。除了使用 self,您还可以使用装饰器@staticmethod来指示该方法在您的类中的作用。更多信息可以在这里找到[外部链接]

最后的想法

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

  • 谢谢!这是一个很好的答案。所以本质上,我想做的是创建静态方法,我可以只使用 @staticmethod 装饰器?我想我可能只是改变设计以避免在这种情况下使用类(因为我认为这里没有必要),但这非常有用。 (2认同)
  • @RagnarLothbrok `@staticmethod` 装饰器适用于不需要类实例甚至类的方法。它们只是放置在类中的函数。您可以通过类名或类实例调用它们,装饰器将确保没有“self”参数。还有类方法,由装饰器“@classmethod”指示。在这种情况下,第一个参数是类而不是类实例,通常称为“cls”。这可能是类本身,也可能是使用它作为基类(直接或间接)的任何类。 (2认同)