python的self使用

self是什么

在Python类中规定,在定义类的过程中,无论是显式创建类的构造方法,还是向类中添加实例方法,都要求将 self 参数作为方法的第一个参数,表示当前类的对象,可以调用当前类中的属性和方法。
self代表类的实例,不是类本身

class Test():
    def testfunc(self):
        print(self)
        print(self.__class__)
t=Test()
t.testfunc()

输出为:

<__main__.Test object at 0x000002DF2860BD88>
<class '__main__.Test'>

self在类的方法中可以不写吗?

不可以,在Python的解释器内部,当我们调用t.testfunc()时,实际上Python解释成Test.testfunc(t),也就是说把self替换成类的实例。

class Test():
    def testfunc():
        print(self)
        print(self.__class__)
t=Test()
t.testfunc()

报错:

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

类方法除外
即在定义和调用时均不传实例

class Test():
    def testfunc():
        print(__class__)
        
Test.testfunc()#<class '__main__.Test'>

在继承时,传入的是哪个实例,self就是指那个传入的实例,而不是指定义了self的类的实例,即:self总是指调用时的类的实例。

class Test1():
    def testfunc1(self):
        print(self)
class Test2(Test1):
    def testfunc2(self):
        print(self)

cc=Test2()
cc.testfunc2()
cc.testfunc1()
tt=Test1()
tt.testfunc1()

运行cc.testfunc2()时,指的是Test2类的实例。
运行cc.testfunc1()时,等同于Test2.testfunc1(cc),所以self指的依然是Test2类的实例,由于self中没有定义testfunc1()方法,所以沿着继承树往上找,发现在父类Test1中定义了testfunc1()方法,所以就会成功调用。
所以输出为:

<__main__.Test2 object at 0x0000020210152BC8>
<__main__.Test2 object at 0x0000020210152BC8>
<__main__.Test1 object at 0x0000020210152C48>

self 参数的具体作用是什么呢?

打个比方,如果把类比作造房子的图纸,那么类实例化后的对象是真正可以住的房子。根据一张图纸(类),我们可以设计出成千上万的房子(类对象),每个房子长相都是类似的(都有相同的类变量和类方法),但它们都有各自的主人,那么如何对它们进行区分呢?
当然是通过 self 参数,它就相当于每个房子的门钥匙,可以保证每个房子的主人仅能进入自己的房子(每个类对象只能调用自己的类变量和类方法)。
也就是说,同一个类可以产生多个对象,当某个对象调用类方法时,该对象会把自身的引用作为第一个参数自动传给该方法,换句话说,Python 会自动绑定类方法的第一个参数指向调用该方法的对象。如此,Python解释器就能知道到底要操作哪个对象的方法了。
因此,程序在调用实例方法和构造方法时,不需要手动为第一个参数传值。
通过self调用类的成员变量:

class Test():
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def testfunc1(self):
        print("I'm",self.name,",",self.age,"years old")

te1=Test("Tom",19)
te1.testfunc1()#I'm Tom , 19 years old
te2=Test("lili",17)
te2.testfunc1()#I'm lili , 17 years old

te1在进行初始化时,调用的构造函数中 self 代表的是 “Tom 19”;而 te2 在进行初始化时,调用的构造函数中 self 代表的是"lili 17"

通过self调用类的方法:

class Test():
    def __init__(self,number1,number2):
        self.number1=number1
        self.number2=number2
    def add(self):
        return self.number2+self.number1
    def multip(self):
        return self.number2 * self.number1
    def show(self):
        print("Result Add",self.add())
        print("Result Mul:",self.multip())

te=Test(12,5)
te.show()
#Result Add 17
#Result Mul: 60

1、init 方法的第一个参数永远是 self ,表示创建的实例本身,因此,在 init 方法的内部,就可以把各种属性绑定到 self,因为 self 就指向创建的 实例本身
2、使用了 init 方法,在创建实例的时候就不能传入 空的参数了,必须传入与 init 方法匹配的参数,但是 self 不需要传,python解释器会自己把实例变量传进去

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值