类与函数:我是否需要使用';自我';关键字,如果在Python中使用类?

类与函数:我是否需要使用';自我';关键字,如果在Python中使用类?,python,function,class,object,self,Python,Function,Class,Object,Self,我有一个数据工程项目,从联邦政府网站上获取一些数据并转换这些数据。对于是否需要使用“self”关键字,或者根本不使用类是更好的做法,我有点困惑。这是它目前的组织方式: 类GetGovtData(): def get_data_1(arg1=0,arg2=1): df=执行一些操作 返回df def get_data_2(arg1=4,arg2=5): df=执行一些操作 返回df 我在这里主要使用一个类来进行组织。例如,我需要使用一个类中的十几个不同方法。我发现键入以下内容更美观/更容易: f

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

类GetGovtData():
def get_data_1(arg1=0,arg2=1):
df=执行一些操作
返回df
def get_data_2(arg1=4,arg2=5):
df=执行一些操作
返回df
我在这里主要使用一个类来进行组织。例如,我需要使用一个类中的十几个不同方法。我发现键入以下内容更美观/更容易:

from data.get_govt_data导入GetGovtData
df1=GetGovtData.get_数据_1()
df2=GetGovtData.get_数据_2()
而不是:

从数据导入获取政府数据
df1=获取政府数据。获取数据1()
df2=获取政府数据。获取数据2()

有很多下划线。所以我只是好奇,如果使用这样一个类而不考虑“self”,这是否会被认为是糟糕的代码?或者我应该在我的文件中删除类并使用一系列函数吗?

我想您有一个名为
data/get\u govt\u data.py
的文件,其中包含您的第一个代码块。您可以将该文件重命名为
data/GetGovtData.py
,删除
class
行,如果愿意的话,完全不用处理类。那你就可以了

from data import GetGovtData

df1 = GetGovtData.get_data_1()
根据您的设置,您可能需要为Python创建一个空文件
data/\uuuu init\uuuu.py
,以便将
数据
作为一个模块查看


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

首先回答标题中的问题:确切的字符串“self”是一个约定(顺便说一句,我看不到忽略此约定的有效理由),但类方法中的第一个参数始终是对类实例的引用


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

如果在Python类中开发函数,可以使用两种方法定义函数:一种是使用self作为第一个参数,另一种是不使用self

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

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

没有自我的功能 函数而不初始化类的实例。这就是为什么可以在导入的类上直接调用它们

替代解决方案 这是基于Tom K的注释。您也可以使用decorator
@staticmethod
来指示方法在类中的角色,而不是使用self。可以找到更多信息

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

这里有很多语法错误。这些应该是方法吗?它们似乎不在一个类中。它们是要缩进的吗?另外,
Class
不是Python关键字。你是说上课吗?如果这两个函数实际上是类方法或静态方法,那么使用适当的装饰器将它们标记为类方法或静态方法。类方法希望知道该类,但不需要该类的实例。静态方法只是在类中定义的函数。您仍然可以在不使用类的情况下实现相同的功能,在这里您不应该使用类。将文件重命名为
GetGovtData
,然后从data import GetGovtData以这种方式导入它(但不带类),然后调用函数的方式仍然有效。不,绝对不应该以这种方式使用类。请注意,我不认为有人侮辱了你的智慧。已经指出的是,您没有按照预期的方式使用类。如果您使用了一个好的教程,例如StackOverflow,它会很有帮助,因为StackOverflow不能替代它。如果您正在使用这样的类,那么至少应该使方法
staticmethod
s。我的建议:从表面上看,这些评论通常是建议,而不是无端的侮辱。谢谢拉格纳!我对这一点也很陌生,但感觉和你一样。@RagnarLothbrok对文件名使用
snake\u case
是一种惯例,老实说,如果这是你不使用模块(这将是预期的用例,用于组织代码,尤其是函数和类)的主要顾虑的话那么简单地打破这个惯例,使用
CapitalCase
可能是最不坏的解决方案这就是我想要做的,但我的问题是:使用camelCase或CapitalCase命名.py文件是否存在问题?.py文件的情况不会导致问题。这只是惯例。请参阅编辑。感谢Tom的输入。我把它包括在我的答案里了。谢谢!这是一个很好的答案