关于python的self

我们在使用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*2

class 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()

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值