在__init__中调用类函数

我正在编写一些代码,它接受一个文件名,打开文件,并解析出一些数据。我想在课堂上做这个。下面的代码工作:

class MyClass():
def __init__(self, filename):
self.filename = filename


self.stat1 = None
self.stat2 = None
self.stat3 = None
self.stat4 = None
self.stat5 = None


def parse_file():
#do some parsing
self.stat1 = result_from_parse1
self.stat2 = result_from_parse2
self.stat3 = result_from_parse3
self.stat4 = result_from_parse4
self.stat5 = result_from_parse5


parse_file()

但这涉及到我将所有解析机制放在类的__init__函数的范围内。对于这个简化的代码,现在看起来很好,但是函数parse_file也有相当多的缩进级别。我更喜欢将函数parse_file()定义为如下所示的类函数:

class MyClass():
def __init__(self, filename):
self.filename = filename


self.stat1 = None
self.stat2 = None
self.stat3 = None
self.stat4 = None
self.stat5 = None
parse_file()


def parse_file():
#do some parsing
self.stat1 = result_from_parse1
self.stat2 = result_from_parse2
self.stat3 = result_from_parse3
self.stat4 = result_from_parse4
self.stat5 = result_from_parse5

当然,这段代码不能工作,因为函数parse_file()不在__init__函数的作用域内。是否有方法从类的__init__中调用类函数?还是我想错了?

254984 次浏览

我认为你的问题实际上是没有正确缩进初始化函数。应该是这样的

class MyClass():
def __init__(self, filename):
pass


def parse_file():
pass

按如下方式调用函数:

self.parse_file()

你还需要像这样定义你的parse_file()函数:

def parse_file(self):

parse_file方法在调用时必须绑定到对象(因为它不是静态方法)。这是通过在对象的实例上调用函数来完成的,在你的例子中,实例是self

如何:

class MyClass(object):
def __init__(self, filename):
self.filename = filename
self.stats = parse_file(filename)


def parse_file(filename):
#do some parsing
return results_from_parse
顺便说一下,如果你有名为stat1stat2等变量,这种情况是要求一个元组: stats = (...) . < / p > 所以让parse_file返回一个元组,并将该元组存储在 self.stats . < / p >

然后,例如,你可以用self.stats[2]访问以前被称为stat3的对象。

如果我没有错的话,这两个函数都是你类的一部分,你应该这样使用它:

class MyClass():
def __init__(self, filename):
self.filename = filename


self.stat1 = None
self.stat2 = None
self.stat3 = None
self.stat4 = None
self.stat5 = None
self.parse_file()


def parse_file(self):
#do some parsing
self.stat1 = result_from_parse1
self.stat2 = result_from_parse2
self.stat3 = result_from_parse3
self.stat4 = result_from_parse4
self.stat5 = result_from_parse5

更换你的线路:

parse_file()

:

self.parse_file()

parse_file中,取self参数(就像在__init__中一样)。如果你需要任何其他上下文,那么就像往常一样将它作为附加参数传递。

你必须像这样声明parse_file;def parse_file(self)。"self"形参在大多数语言中是一个隐藏形参,但在python中不是。必须将它添加到属于类的所有方法的定义中。 然后可以使用self.parse_file

从类中的任何方法调用该函数

你的最终程序看起来是这样的:

class MyClass():
def __init__(self, filename):
self.filename = filename


self.stat1 = None
self.stat2 = None
self.stat3 = None
self.stat4 = None
self.stat5 = None
self.parse_file()


def parse_file(self):
#do some parsing
self.stat1 = result_from_parse1
self.stat2 = result_from_parse2
self.stat3 = result_from_parse3
self.stat4 = result_from_parse4
self.stat5 = result_from_parse5