关于python的self

来源:互联网 发布:知乎 hiv携带者 编辑:程序博客网 时间:2024/05/10 14:39

我们在使用python工作的过程中,常常被其类内繁多的self所困扰,在这里总结一下我对self的理解。

class test:    def fun(self):        print("Hello")obj=test()obj.fun()

这是python中一个简单的类,如果我们删掉其中的self,会得到下面这个错误。

TypeError: fun() takes 0 positional arguments but 1 was given

这个报错给人一种分外眼熟的感觉,比如如下的代码就会得到完全相同的错误。

def fun():    print("Hello")fun("Hello")

这其实就是编译器在警告我们这里的形参数量为零,但是我们却传递了一个实参进去。然而在第一段代码中我们调用这个方法的时候,并没有传递任何实参。因此实际上是编译器在编译之前对我们的代码进行了预处理,在实参列表的最前面为我们自动加上了一个实参用来传递指针,有一点类似C中的this指针。

因此我们虽然是像:

obj.fun()

这样来调用这个方法,但实际上真正进行编译的代码类似于这样:

test.fun(obj)

因此self其实并不是一个关键字,他只是一个我们用来接收这个指针的默认写法,例如如下这段代码并不会产生任何错误:

class test:    def fun(a,b):        print(b)obj=test()obj.fun(10)

因此我们平时在在类内调用成员变量和方法时在其之前所写的self也是一样的道理,只是显式的表现了其私有性,例如下面这段代码也是完全正确的:

class test:    def __init__(a,b):        a.variable=b    def fun(c,d):        print(c.variable+d)obj=test(10)obj.fun(20)

在《dive into python》中有对self的这样的描述:“在 init 方法中,self 指向新创建的对象;在其它的类方法中,它指向方法被调用的类实例”。这样做有一个好处,那就是当进行类的继承的时候,我们可以通过这种方式比较明确的知道成员变量和方法所从属的位置,也可以相对比较自由的在类内的任何位置创建局部变量或成员变量。

class parent:    def __init__(self):        self.a=1    def multiply(self,a):        return a*2class test(parent):    def __init__(self):        parent.__init__(self)        self.b=1    def fun(self):        print(self.multiply(self.a+self.b))object=test()object.fun()

(本文所用资料均来源于网络)

1 0
原创粉丝点击