在__init__中调用类函数

Pyt*_*Jin 110 python class

我正在编写一些带有文件名的代码,打开文件并解析出一些数据.我想在课堂上这样做.以下代码有效:

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

但它涉及我将所有解析机制放在__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
Run Code Online (Sandbox Code Playgroud)

当然这个代码不起作用,因为该函数parse_file()不在函数的范围内__init__.有没有办法从该类中调用类函数__init__?或者我是否以错误的方式思考这个问题?

Lew*_*ond 154

以这种方式调用函数:

self.parse_file()
Run Code Online (Sandbox Code Playgroud)

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

def parse_file(self):
Run Code Online (Sandbox Code Playgroud)

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


Par*_*ngh 29

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

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

替换你的行:

parse_file() 
Run Code Online (Sandbox Code Playgroud)

有:

self.parse_file()
Run Code Online (Sandbox Code Playgroud)


unu*_*tbu 11

怎么样:

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

顺便说一句,如果有一个名为变量stat1,stat2等等,情况正在乞求一个元组: stats = (...).

所以让我们parse_file返回一个元组,然后将元组存储起来 self.stats.

然后,例如,您可以访问以前调用stat3的内容self.stats[2].