好吧,所以当我看到这个时,我正在看一些来源:

>>> 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在某个类定义中。
不能从类定义中提取方法defs方法函数定义是类的一部分。
看看这两个例子:

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
class方法确实使用self通常,所有实例方法都将使用self,除非它们有特定的修饰符,如@classmethod,否则会使用。
这个函数不依赖于其他任何东西。
类方法取决于被类的实例调用;此外,它还取决于类的实例是否已正确初始化。在这种情况下,初始化函数(Adder)确保Adder的每个实例始终有一个名为__init__的实例变量,并且该实例变量的初始值为Adder
不能将grand_total方法函数从0类中拉出并单独使用它。它不是一个独立的功能。它是在类内定义的,并且由于在类内的位置而具有某些期望。

08-04 23:46
查看更多