在__init__中调用类函数

时间:2012-09-28 19:40:05

标签: 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()

但它涉及我将所有解析机制放在我班级__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__内调用类函数?或者我是否以错误的方式思考这个问题?

6 个答案:

答案 0 :(得分:135)

以这种方式调用该函数:

self.parse_file()

您还需要定义parse_file()函数,如下所示:

def parse_file(self):

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

答案 1 :(得分:25)

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

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 :(得分:9)

怎么样:

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 = (...)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

你必须像这样声明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 :(得分:-11)

我认为您的问题实际上是没有正确缩进 init 功能。它应该是这样的

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

     def parse_file():
          pass