好吧,当我看到这个时,我正在查看一些来源:
>>> def __parse(self, filename):
... "parse ID3v1.0 tags from MP3 file"
... self.clear()
... try:
... fsock = open(filename, "rb", 0)
... try:
... fsock.seek(-128, 2)
... tagdata = fsock.read(128)
... finally:
... fsock.close()
... if tagdata[:3] == 'TAG':
... for tag, (start, end, parseFunc) in self.tagDataMap.items():
... self[tag] = parseFunc(tagdata[start:end])
... except IOError:
... pass
...
所以,我决定测试一下。
>>> __parse("blah.mp3")
而且,我收到了这个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __parse() takes exactly 2 arguments (1 given)
这不是我第一次遇到这种情况,我一直认为我应该将 self 包含在参数参数列表中,但我知道那是不对的。有人可以向我解释为什么我尝试使用的代码会经常发生这种情况,我想这是由于我对这些术语的理解程度,我什至几乎不了解 init 或 self 的作用,或者它们的相关性。 def x(b): print b 与 def x(self, b): self.b = b print self.b 相同,不是吗?为什么这么重要!
我只是想要一个基本的解释,这样我就可以把它从脑海中抛开,谢谢。
最佳答案
def __parse
在一些类定义中。
您不能从类定义中提取方法定义。方法函数定义是类的一部分。
看这两个例子:
def add( a, b ):
return a + b
和
class Adder( object ):
def __init__( self ):
self.grand_total = 0
def add( self, a, b ):
self.grand_total += a+b
return a+b
注释。
函数不使用
self
。类方法确实使用了
self
。通常,所有实例方法都将使用self
,除非它们有特定的装饰器,如@classmethod
另有说明。该函数不依赖于其他任何东西。
类方法依赖于类
Adder
的实例调用;此外,它取决于类Adder
的实例是否已正确初始化。在这种情况下,初始化函数 (__init__
) 已确保Adder
的每个实例始终有一个名为grand_total
的实例变量,并且该实例变量具有0
的初始值。您不能将
add
方法函数从Adder
类中拉出来单独使用。它不是一个独立的功能。它是在类内部定义的,并且由于在类内部的位置而具有一定的期望。
关于Python、__init__ 和 self 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/674600/