python的self使用

python的self使用,第1张

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

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 oldte2=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解释器会自己把实例变量传进去

总结

以上是内存溢出为你收集整理的python的self使用全部内容,希望文章能够帮你解决python的self使用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1189068.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存