奇怪的额外争论

时间:2012-03-13 13:43:47

标签: python wxpython

我得到了以下python代码,当单击一个按钮时调用printSaved(使用wx库和python 2.7.2)。但是当发生这种情况时,我得到了一个非常奇怪的错误

Traceback (most recent call last):
  File "./program.py", line 135, in printSaved
    s = self.readSaved()
TypeError: readSaved() takes no arguments (1 given)

这是代码

  def readSaved():
    f = codecs.open((os.getenv('HOME') +'/Dokument/savefile.txt') ,'r','utf-8')
    l = f.readlines()
    f.close()
    return l

  def printSaved(self,event):
    s = self.readSaved()
    for l in s:
      print l

我通过向readSaved(somethingUseless)添加一个参数来解决问题,一切正常。我的问题是什么传递给readSaved和HOW / WHY?这与活动有关吗?

4 个答案:

答案 0 :(得分:3)

在Python中,调用方法的对象总是作为参数显式传递。此参数通常称为self

readSaved()作为实例方法的正确定义应将此作为第一行:

def readSaved(self):
    # ...

如果您希望它是模块级函数,您应该按如下方式调用它:

s = readSaved()

答案 1 :(得分:2)

答案 2 :(得分:1)

是否在课程中定义?我想它确实如此,因为第二种方法需要self

如果readSaved是实例方法,那么它也需要self作为第一个参数。如果您不需要它,请改为使用@staticmethod装饰器:

@staticmethod
def readSaved():
  f = codecs.open((os.getenv('HOME') +'/Dokument/savefile.txt') ,'r','utf-8')
  l = f.readlines()
  f.close()
  return l

答案 3 :(得分:0)

因为它是一种方法 - 你将它称为方法,无论如何 - 你必须至少有self作为参数。当函数作为方法调用时,调用方法的对象将作为该函数的第一个参数传递。