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

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__中调用类函数?还是我想错了?


我认为你的问题是没有正确缩进init函数。应该是这样的

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

顺便说一下,如果你有一个名为stat1, stat2等变量,情况是乞求一个元组: 统计=(…)。

因此,让parse_file返回一个元组,并将该元组存储在 self.stats。

然后,例如,您可以使用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"形参在大多数语言中是一个隐藏形参,但在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