python中的self

骑猪看日落 2022-02-22 15:48 335阅读 0赞

python中的self代表类的实例,处理代码中可以使用self+“.”+类中的方法的方式调用函数。

self代表类的实例,并非类本身

例如:

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

执行结果如下

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

从上面的例子中可以很明显的看出,self代表的是类的实例。而self.__class__则指向类。

self不必非写成self

有很多童鞋是先学习别的语言然后学习Python的,所以总觉得self怪怪的,想写成this,可以吗?
当然可以,还是把上面的代码改写一下。

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

改成this后,运行结果完全一样。
当然,最好还是尊重约定俗成的习惯,使用self。

self可以不写吗

在Python的解释器内部,当我们调用t.prt()时,实际上Python解释成Test.prt(t),也就是说把self替换成类的实例。
有兴趣的童鞋可以把上面的t.prt()一行改写一下,运行后的实际结果完全相同。
实际上已经部分说明了self在定义时不可以省略,如果非要试一下,那么请看下面:

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

运行时提醒错误如下:prt在定义时没有参数,但是我们运行时强行传了一个参数。
由于上面解释过了t.prt()等同于Test.prt(t),所以程序提醒我们多传了一个参数t。

  1. Traceback (most recent call last):
  2. File "h.py", line 6, in <module>
  3. t.prt()
  4. TypeError: prt() takes 0 positional arguments but 1 was given

当然,如果我们的定义和调用时均不传类实例是可以的,这就是类方法


情况一:

  1. class Test:
  2. def prt():
  3. print(__class__)
  4. Test().prt()

解释:
Test()是类的实例化,Test().prt()类实例化之后,调用类中的方法。


情况二:

  1. class Test:
  2. def prt():
  3. print(__class__)
  4. Test.prt(Test())

解释:
Test.prt(Test())中Test.prt()为调用类中的方法,其中参数Test()为实例化的对象。


情况三:

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

解释:
情况与第一种情况相同。


情况四:

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

解释:
情况与第二种情况相同。


类中的self.function()方法

问题一:类中相互调用function方法,使用class.function和self.function的方法有什么区别?
问题:

  1. class test:
  2. def eat(self):
  3. print("lei eat")
  4. def he(self):
  5. print("lei he")
  6. test.eat(self)
  7. test().he()

输出:

  1. lei he
  2. lei eat

问题:

  1. class test:
  2. def eat(self):
  3. print("lei eat")
  4. def he(self):
  5. print("lei he")
  6. self.eat()
  7. test().he()

输出:

  1. lei he
  2. lei eat

解释:

  • test.eat(self)使用了类名test,相当于调用类中的方法,并没有对类进行实例化,而方法eat参数有self,因此要使用 test.eat(self)的方式。
  • 或者使用self.eat()的方式,其中eat()中没有参数self,因为self等价于对类test的实例化。同时也等价于test().eat().

发表评论

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

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

相关阅读

    相关 python self 含义

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

    相关 Pythonself详解

    一、概念 哪个对象调用了方法,方法里的`self`指的就是谁。 通过 `self.属性名` 可以访问到这个对象的属性。 通过 `self.方法名()` 可以调用这个对

    相关 Pythonself用法

    在Python类中规定,函数的第一个参数是实例对象本身,并且约定俗成,把其名字写为self。其作用相当于java中的this,表示当前类的对象,可以调用当前类中的属性和方法。

    相关 Pythonself,cls参数

    python类里会出现这三个单词,self和cls都可以用别的单词代替,类的方法有三种, 一是通过def定义的 普通的一般的,需要至少传递一个参数,一般用self,这样的方法

    相关 python self

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

    相关 Pythonself使用时机

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

    相关 pythonself

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