问题:在__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__
?还是我想这是错误的方式?
回答 0
以这种方式调用该函数:
self.parse_file()
您还需要像这样定义parse_file()函数:
def parse_file(self):
该parse_file
方法必须在调用时绑定到对象(因为它不是静态方法)。这是通过在对象的实例上调用函数来完成的(在您的情况下,实例是)self
。
回答 1
如果我没记错的话,这两个函数都是您的类的一部分,则应像这样使用它:
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()
回答 2
怎么样:
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
顺便说一句,如果有一个名为变量stat1
,stat2
等等,情况正在乞求一个元组:
stats = (...)
。
因此,让我们parse_file
返回一个元组,并将其存储在中
self.stats
。
然后,例如,您可以访问曾经使用调用stat3
的内容self.stats[2]
。
回答 3
在中parse_file
,接受self
参数(与中一样__init__
)。如果您需要任何其他上下文,则只需照常将其作为附加参数传递。
回答 4
您必须像这样声明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
回答 5
我认为您的问题实际上是没有正确缩进init函数,应该是这样的
class MyClass():
def __init__(self, filename):
pass
def parse_file():
pass