Python里面的self,是谁啊
发布时间:2025-05-14 02:57:36 发布人:远客网络
一、Python里面的self,是谁啊
1、大家学Python面向对象的时候,总会遇到一个让人难以理解的存在:self
2、这个self到底是谁啊,为什么每个类实例方法都有一个参数self,它到底有什么作用呢?
3、「先下结论:类实例化后,self即代表着实例(对象)本身」
4、想要理解self有个最简单的方法,就是你把self当做「实例(对象)的身份证。」
5、 Python的类不能直接使用,只有通过创建实例(对象)才能发挥它的功能,每个实例(对象)都是独一无二的,它可以调用类的方法、属性。类就像灵魂附体一样,让实例(对象)有了自己(self)的功能。
6、初学者会发现,类的方法(构造方法和实例方法)中都会有一个固定参数self,其实这个参数就是代表着实例(对象)本身,就像是一个身份证,实例可以凭着身份证去调用类方法。
7、类比人类,人类就是一个Python类,每个个体的人代表着实例(对象),而每个人的身份证代表的Python中self,每个人可以凭借身份证去上大学、坐高铁、住酒店...(方法),而Python中的实例(对象)也可以凭着self去调用类的方法。
8、上面是用类比的方法解释了下self的含义,说到底self就是代表着实例本身,「当某个实例(对象)调用类方法时,该对象会把自身的引用作为第一个参数自动传给该方法,而这第一个参数就是self。」
9、而且self只是约定俗成的写法,你可以用任何其他名称代替self,不会改变代码含义,只不过我们一般不这样做。
10、为了更好的说明self的作用,我们来举个例子,下面有一个Students类:
11、可以看出,实例(对象)不一样,打印出的结果也不一样,当类被实例化后,self.name其实就等于实例(对象).name
12、还是以刚刚的代码为例,我们再来调用里面的实例方法,里面会打印出self,就能看得更加明显了
13、大家能清楚看到两个实例打印出的self是不一样的,因为self代表着实例(对象)本身。
14、以实例student_b来说,打印self出现下面对象信息
15、如果再打印 student_b,会出现同样的结果
16、这个时候是不是就清楚了,类实例化后,self即代表着实例(对象)本身
二、python中的self
首先,对于python,只有针对类来说的self才有意义,所以python中的self,说的即是python类中的self。
以下我将结合python类的相关概念叙述,必须明确的是,self只能用在python类的方法(即函数)中。
在我看来,python的类有三个相关概念:属性(即变量)、方法(即函数)、继承。
(1)如果变量定义在类下面而不是类的方法下面,那这个变量既是类的属性也是类实例的属性。
(2)如果变量定义在类的方法下面,如果加了self,那这个变量就是类实例的属性,不是类的属性;如果没有加self,这个变量只是这个方法的局部变量,既不是类的属性也不是类实例的属性。
(1)如果在类中定义函数时加了self,那这个函数是类实例的方法,而不是类的方法。
(2)如果在类中定义函数时候没有加self,那这个函数就只是类的方法,而不是类实例的方法。
通俗的讲,子类继承父类,也就是子类继承了父类的属性和方法,相当于把父类的属性和方法的定义直接加到子类里来,这个时候以子类为主。
说明:以上阐述是基于我个人的理解用最直观的语言进行的总结,如果有错误欢迎提出
三、python中的__init__(self)是什么意思呢
1、Python中,__init__()方法是所谓的对象的“构造函数”,负责在对象初始化时进行一系列的构建操作
2、pass
在Python中,对某个类实例进行成员赋值,可以创建不存在的成员:
3、在Python中,对某个类实例进行成员赋值,可以创建不存在的成员:
4、>>>a.name='Bob'
如果对于每一个worker类的实例对象,都要进行如此赋值的话,这个类会变得很难使用
5、如果对于每一个worker类的实例对象,都要进行如此赋值的话,这个类会变得很难使用
6、另外,对于用于特殊场合的类,可能要求在对象创建时,进行连接数据库、连接FTP服务器、进行API验证等操作,这些初始化操作,都可以封装在__init__()方法中进行
7、__init__方法使用如下规则定义:
8、pass
__init__方法必须接受至少一个参数即self,Python中,self是指向该对象本身的一个引用,通过在类的内部使用self变量,类中的方法可以访问自己的成员变量,简单来说,self.varname的意义为”访问该对象的varname属性“
9、__init__方法必须接受至少一个参数即self,Python中,self是指向该对象本身的一个引用,通过在类的内部使用self变量,类中的方法可以访问自己的成员变量,简单来说,self.varname的意义为”访问该对象的varname属性“
10、当然,__init__()中可以封装任意的程序逻辑,这是允许的,__init__()方法还接受任意多个其他参数,允许在初始化时提供一些数据,例如,对于刚刚的worker类,可以这样写:
11、self.pay=pay
这样,在创建worker类的对象时,必须提供name和pay两个参数:
12、这样,在创建worker类的对象时,必须提供name和pay两个参数:
13、>>>b=worker('Jim',5000)
Python会自动调用worker.__init__()方法,并传递参数。
14、Python会自动调用worker.__init__()方法,并传递参数。
15、通常情况下,self形参由Python自动赋值,但是,在类继承中,并不是这样
16、例如,Python的HTML处理工具HTMLParser,是一个基于OOP模型的工具,要使用该工具,必须编写一个类,继承html.parser.HTMLParser类,并重载一系列方法,以定制自己的功能
17、HTMLParser.__init__(self)
此处,需要调用了HTMLParser类的__init__方法,而且,此处手动给HTMLParser.__init__()方法的self形参赋值,事实上,如果不显式指定self形参的值,Python不会在此处自动为HTMLParser.__init__()方法的self形参进行赋值
18、此处,需要调用了HTMLParser类的__init__方法,而且,此处手动给HTMLParser.__init__()方法的self形参赋值,事实上,如果不显式指定self形参的值,Python不会在此处自动为HTMLParser.__init__()方法的self形参进行赋值
19、如此设计的原因是,在子类中需要获得超类的成员和方法,而通过在子类的__init__方法中调用超类的__init__方法,并手动给它传递指向子类的self值,可以使超类的__init__方法将所初始化的变量设置成子类的变量,这样,就可以在子类中直接访问超类的变量了。