社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python里面的self,是谁啊?

小白学视觉 • 1 年前 • 300 次点击  

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

大家学Python面向对象的时候,总会遇到一个让人难以理解的存在:self

这个self到底是谁啊,为什么每个类实例方法都有一个参数self,它到底有什么作用呢?

「先下结论:类实例化后,self即代表着实例(对象)本身」

想要理解self有个最简单的方法,就是你把self当做「实例(对象)身份证。」

Python的类不能直接使用,只有通过创建实例(对象)才能发挥它的功能,每个实例(对象)都是独一无二的,它可以调用类的方法、属性。类就像灵魂附体一样,让实例(对象)有了自己(self)的功能。

初学者会发现,类的方法(构造方法和实例方法)中都会有一个固定参数self,其实这个参数就是代表着实例(对象)本身,就像是一个身份证,实例可以凭着身份证去调用类方法。

类比人类,人类就是一个Python类,每个个体的人代表着实例(对象),而每个人的身份证代表的Python中self,每个人可以凭借身份证去上大学、坐高铁、住酒店...(方法),而Python中的实例(对象)也可以凭着self去调用类的方法。

上面是用类比的方法解释了下self的含义,说到底self就是代表着实例本身,「当某个实例(对象)调用类方法时,该对象会把自身的引用作为第一个参数自动传给该方法,而这第一个参数就是self。」

而且self只是约定俗成的写法,你可以用任何其他名称代替self,不会改变代码含义,只不过我们一般不这样做。另外,搜索公众号顶级架构师后台回复“面试”,获取一份惊喜礼包。

为了更好的说明self的作用,我们来举个例子,下面有一个Students类:

class Students:
    # 构造方法
    def __init__(self,name):
        self.name = name

    # 实例方法
    def study(self,examination_results):
        self.examination_results = examination_results
        print("同学{}的考试分数是{}".format(self.name,self.examination_results))
        print("该实例对象的地址是{}".format(self))

先来个实例student_a

studend_a = Students('studend_a')
print(studend_a.name)

结果打印出:studend_a

再来个实例student_b

studend_b = Students('studend_b')
print(studend_b.name)

结果打印出:studend_b

可以看出,实例(对象)不一样,打印出的结果也不一样,当类被实例化后,self.name其实就等于实例(对象).name

还是以刚刚的代码为例,我们再来调用里面的实例方法,里面会打印出self,就能看得更加明显了

实例student_a:

studend_a = Students('studend_a')
print(studend_a.study(80))

输出结果:

同学studend_a的考试分数是80 该实例对象的地址是<「main」.Students object at 0x00000129EB0F6A90>

实例student_b:

studend_b = Students('studend_b')
print(studend_b.study(80))

输出结果:

同学studend_b的考试分数是80 该实例对象的地址是<「main」.Students object at 0x00000129EB0F6B38>

大家能清楚看到两个实例打印出的self是不一样的,因为self代表着实例(对象)本身。

以实例student_b来说,打印self出现下面对象信息

<__main__.students object at>

如果再打印 student_b,会出现同样的结果

print(student_b)

输出:

<__main__.students object at>

这个时候是不是就清楚了,类实例化后,self即代表着实例(对象)本身

你还有什么想要补充的吗?

下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/162106
 
300 次点击