每天开心一点

python中对self的理解

2020-08-31 15:34:00    六月    519    来源: https://blog.csdn.net/qq_37616069/article/details/79386928

首先介绍python中的类和实例,面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板,而实例是根据类创建出来的一个个具体的“对象”,每一个对象都从类中继承有相同的方法,但各自的数据可能不同。

我们在创建实例的时候,需要对实例的属性进行初始化,Python当中的一个内置方法__init__方法。

注意:(1)、__init__方法的第一参数永远是self,表示创建的类实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。

(2)、有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器会自己把实例变量传进去

所谓的self,可以理解为自己

可以把self当做C++中类里面的this指针一样理解,就是对象自身的意思

某个对象调用其方法时,python解释器会把这个对象作为第一个参数传递给self,所以开发者只需要传递后面的参数即可

  普通数相比,在类中定义函数只有一点不同,就是第一参数永远是类的本身实例变量self,并且调用时,不用传递该参数。除此之外,类的方法(函数)和普通函数没啥区别,你既可以用默认参数、可变参数或者关键字参数(*args是可变参数,args接收的是一个tuple,**kw是关键字参数,kw接收的是一个dict)。

Self的用法:

(1)、self代表类的实例,而非类

   self代表的是类的实例。而self.__class__则指向类。

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

(2)、self可以不写吗?

   self在定义时不可以省略,不过我们也可以使用如this,that等其他变量名。当然,如果我们的定义和调用时均不传类实例是可以的,这就是类方法。

class MyClass:
    def f(that):
        print(that.__class__)
x = MyClass()
x.f()

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

class Parent:       
    def pprt(self):
        print(self)
class Child(Parent):
    def cprt(self):
        print(self)
c = Child()
c.cprt()        #__main__.Child
c.pprt()        #__main__.Child
p = Parent()
p.pprt()        #__main__.Parent

(4)、在描述符类中,self指的是描述符类的实例

参考: https://blog.csdn.net/qq_37616069/article/details/79386928

    https://blog.csdn.net/sinat_41842926/article/details/87930787

    https://blog.csdn.net/cwy0502/article/details/91392490

    https://blog.csdn.net/weixin_30571465/article/details/95358411