Python、__init__ 和 self 混淆

标签 python self init

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

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

注释。

  1. 函数不使用self

  2. 类方法确实使用了self。通常,所有实例方法都将使用 self,除非它们有特定的装饰器,如 @classmethod 另有说明。

  3. 该函数不依赖于其他任何东西。

  4. 类方法依赖于类Adder的实例调用;此外,它取决于类 Adder 的实例是否已正确初始化。在这种情况下,初始化函数 (__init__) 已确保 Adder 的每个实例始终有一个名为 grand_total 的实例变量,并且该实例变量具有0 的初始值。

  5. 您不能将add 方法函数从Adder 类中拉出来单独使用。它不是一个独立的功能。它是在类内部定义的,并且由于在类内部的位置而具有一定的期望。

关于Python、__init__ 和 self 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/674600/

相关文章:

python - 根据最高编号将类别分配给 ID。子类 - Pandas

python - 使用 SHAP 解释多标签目标 Tensorflow 模型

Swift 编程 UIButtons

Delphi自身关键字

objective-c - 如果 [super init] 返回 nil 为什么不抛出异常?

Python Opencv imshow 错误

python - BackProjection 和 Opencv 的问题

ios - 哪个最好 :calling a property by @synthesize or by using self keyword

Linux 基本设备未关闭

java - init.gradle 从命令行读取属性