python的self使用

桃扇骨 2022-11-04 15:25 251阅读 0赞

self是什么

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

  1. class Test():
  2. def testfunc(self):
  3. print(self)
  4. print(self.__class__)
  5. t=Test()
  6. t.testfunc()

输出为:

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

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

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

  1. class Test():
  2. def testfunc():
  3. print(self)
  4. print(self.__class__)
  5. t=Test()
  6. t.testfunc()

报错:

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

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

  1. class Test():
  2. def testfunc():
  3. print(__class__)
  4. Test.testfunc()#<class '__main__.Test'>

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

  1. class Test1():
  2. def testfunc1(self):
  3. print(self)
  4. class Test2(Test1):
  5. def testfunc2(self):
  6. print(self)
  7. cc=Test2()
  8. cc.testfunc2()
  9. cc.testfunc1()
  10. tt=Test1()
  11. tt.testfunc1()

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

  1. <__main__.Test2 object at 0x0000020210152BC8>
  2. <__main__.Test2 object at 0x0000020210152BC8>
  3. <__main__.Test1 object at 0x0000020210152C48>

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

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

  1. class Test():
  2. def __init__(self,name,age):
  3. self.name=name
  4. self.age=age
  5. def testfunc1(self):
  6. print("I'm",self.name,",",self.age,"years old")
  7. te1=Test("Tom",19)
  8. te1.testfunc1()#I'm Tom , 19 years old
  9. te2=Test("lili",17)
  10. te2.testfunc1()#I'm lili , 17 years old

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

通过self调用类的方法:

  1. class Test():
  2. def __init__(self,number1,number2):
  3. self.number1=number1
  4. self.number2=number2
  5. def add(self):
  6. return self.number2+self.number1
  7. def multip(self):
  8. return self.number2 * self.number1
  9. def show(self):
  10. print("Result Add",self.add())
  11. print("Result Mul:",self.multip())
  12. te=Test(12,5)
  13. te.show()
  14. #Result Add 17
  15. #Result Mul: 60

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

发表评论

表情:
评论列表 (有 0 条评论,251人围观)

还没有评论,来说两句吧...

相关阅读

    相关 pythonself 含义

    现象:Python编写类的时候,类成员函数的第一个参数都是self。 说明:首先明确的是self只有在类的方法中才会有,独立的函数或方法是不必带有self的。self在定义类

    相关 pythonself使用

    > self是什么 在Python类中规定,在定义类的过程中,无论是显式创建类的构造方法,还是向类中添加实例方法,都要求将 self 参数作为方法的第一个参数,表示当前类的对

    相关 python self

    最近在看python的一些代码,学习并且要掌握这些在短期内还是有一点难度的,日积月累,浮躁是个大问题。对于一个基本没从事过开发的我来说,看到python self这个值的时候很

    相关 Pythonself使用时机

    其实,连看了几篇说了好多。我自己觉得就一点最实用: 前缀加了self的变量就成为了全局变量,随处可以调用。 没加前缀self的变量只能局限在其所在的那一层里使用,其他处没法

    相关 pythonself

    python中的self代表类的实例,处理代码中可以使用self+“."+类中的方法的方式调用函数。 self代表类的实例,并非类本身 例如: class T