【问题标题】:Calling a class function inside of __init__在 __init__ 中调用类函数
【发布时间】:2012-09-20 17:04:30
【问题描述】:

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

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

【问题讨论】:

  • 代码示例是否需要五个版本的“stat”?如果只有一个会更容易阅读。

标签: python class


【解决方案1】:

这样调用函数:

self.parse_file()

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

def parse_file(self):

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

【讨论】:

  • 是的!这正是我想要的。谢谢!
【解决方案2】:

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

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

【讨论】:

  • 你能解释一下为什么必须使用self.parse_file()而不是parse_file()吗?
  • @paritoshsingh 不应该将def parse_file(self): 嵌套在__init__ 函数下,这样您就没有部分初始化的对象?
  • @ivanleoncz 由于 parse_file 是实例方法,我们需要使用引用对象来调用它。
  • @rong 如果这段代码是古老的并且你不想允许从外部设置解析文件,是的,它应该是嵌套的。
【解决方案3】:

怎么样:

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.

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

【讨论】:

  • 我同意,我只是将 self.stat1 到 self.stat5 放在那里,以表明我正在分配一些类变量。在实际代码中我有一个更优雅的解决方案。
  • 如果我想让parse_file 函数成为MyClass 对象的方法,应该如何更改。哪里需要self
【解决方案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】:

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

      • 您的代码也不是。除非你把 @staticmethod 装饰器放在 parse_file
      • 至少在您的parse_file 方法中添加缺少的self
      • 糟糕,抱歉,“class MyClass():”行下应该有额外的缩进层。我已经在上面修复了它,但问题仍然存在。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-29
      • 2011-08-31
      • 2021-02-22
      • 1970-01-01
      • 2018-12-02
      相关资源
      最近更新 更多