关于self

self的意思是“自身”,python中代表类的实例,而非类。self只有在类的方法中才会有,独立的函数或方法是不必带有self的;self在定义类的方法时是必须有的。self名称不是必须的,你可以定义成a或b或其它名字都可以,但是约定成俗,可减少理解难度。简单的来说,可能被调用的类方法才需要填self。
python中还有一个if name == 'main':,也在脚本文件的调用中起到控制的作用
一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行。因此 if name == 'main': 的作用就是控制这两种情况执行代码的过程,在 if name == 'main': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而 import 到其他脚本中是不会被执行的。

首先我们要搞明白Python的类中为要什么要用到self这个单词呢,为什么不用"zhangsan"、"lisi"这样的名字呢,这肯定有他的用意。

self代表类的实例,而非类。

class Test:

def prt(self):

    print(self)

    print(self.__class__)

t = Test()

t.prt()

执行结果如下:

<main.Test object at 0x000000000284E080>

<class 'main.Test'>

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

类中的方法第一个参数必须是 self ,不然实例无法正确调用类中的方法,也就是说,如果方法中第一个参数不是 self(广义的),那么这个方法是没有任何价值的,因为实例无法调用它,一个无法被调用的方法真不知道有什么用。

注意:把self换成this,结果也一样,但Python中最好用约定俗成的self。

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

class Parent:

def pprt(self):

    print(self)

class Child(Parent):

def cprt(self):

    print(self)

c = Child()

c.cprt()

c.pprt()

p = Parent()

p.pprt()

运行结果如下:

<main.Child object at 0x0000000002A47080>

<main.Child object at 0x0000000002A47080>

<main.Parent object at 0x0000000002A47240>

解释:

运行c.cprt()时应该没有理解问题,指的是Child类的实例。

但是在运行c.pprt()时,等同于Child.pprt(c),所以self指的依然是Child类的实例,由于self中没有定义pprt()方法,所以沿着继承树往上找,发现在父类Parent中定义了pprt()方法,所以就会成功调用

posted @ 2022-06-15 14:06  小雨淅淅o0  阅读(127)  评论(0编辑  收藏  举报