181

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

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__?还是我想错了?

4

6 回答 6

252

以这种方式调用函数:

self.parse_file()

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

def parse_file(self):

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

于 2012-09-28T19:45:30.300 回答
45

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

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()
于 2012-09-28T19:45:59.360 回答
15

怎么样:

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].

于 2012-09-28T19:45:50.170 回答
1

您必须像这样声明 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
于 2012-09-28T19:47:30.563 回答
0

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

于 2012-09-28T19:47:06.593 回答
-16

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

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

     def parse_file():
          pass
于 2012-09-28T19:44:59.067 回答