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使用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)