51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 907|回复: 0
打印 上一主题 下一主题

[python] 聊聊Python里面的Self,是谁啊?

[复制链接]
  • TA的每日心情
    擦汗
    前天 09:23
  • 签到天数: 967 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-3-21 10:03:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    大家学Python面向对象的时候,总会遇到一个让人难以理解的存在:self。
      这个self到底是谁啊,为什么每个类实例方法都有一个参数self,它到底有什么作用呢?
      「先下结论:类实例化后,self即代表着实例(对象)本身。」
      想要理解self有个最简单的方法,就是你把self当做「实例(对象)的身份证。」
      Python的类不能直接使用,只有通过创建实例(对象)才能发挥它的功能,每个实例(对象)都是独一无二的,它可以调用类的方法、属性。类就像灵魂附体一样,让实例(对象)有了自己(self)的功能。

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

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

     上面是用类比的方法解释了下self的含义,说到底self就是代表着实例本身,「当某个实例(对象)调用类方法时,该对象会把自身的引用作为第一个参数自动传给该方法,而这第一个参数就是self。」
      而且self只是约定俗成的写法,你可以用任何其他名称代替self,不会改变代码含义,只不过我们一般不这样做。
      为了更好的说明self的作用,我们来举个例子,下面有一个Students类:
    1.  class Students:
    2.       # 构造方法
    3.       def __init__(self,name):
    4.           self.name = name
    5.       # 实例方法
    6.       def study(self,examination_results):
    7.           self.examination_results = examination_results
    8.           print("同学{}的考试分数是{}".format(self.name,self.examination_results))
    9.           print("该实例对象的地址是{}".format(self))
    复制代码
    先来个实例student_a。
    1.  studend_a = Students('studend_a')
    2.   print(studend_a.name)
    复制代码
    结果打印出:studend_a。
      再来个实例student_b。
    1. studend_b = Students('studend_b')
    2.   print(studend_b.name)
    复制代码
    结果打印出:studend_b。
      可以看出,实例(对象)不一样,打印出的结果也不一样,当类被实例化后,self.name其实就等于实例(对象).name。
      还是以刚刚的代码为例,我们再来调用里面的实例方法,里面会打印出self,就能看得更加明显了。
      实例student_a:
    1.  studend_a = Students('studend_a')
    2.   print(studend_a.study(80))
    复制代码
    输出结果:
      同学studend_a的考试分数是80 该实例对象的地址是<「main」.Students object at 0x00000129EB0F6A90>。
      实例student_b:
    1.  studend_b = Students('studend_b')
    2.   print(studend_b.study(80))
    复制代码
    输出结果:
      同学studend_b的考试分数是80 该实例对象的地址是<「main」.Students object at 0x00000129EB0F6B38>。
      大家能清楚看到两个实例打印出的self是不一样的,因为self代表着实例(对象)本身。
      以实例student_b来说,打印self出现下面对象信息。
      <__main__.Students object at 0x00000129EB0F6B38>。
      如果再打印 student_b,会出现同样的结果。
    1.  print(student_b)
    复制代码
    输出:
    1.  <__main__.Students object at 0x00000129EB0F6B00>
    复制代码
    这个时候是不是就清楚了,类实例化后,self即代表着实例(对象)本身。






    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-6-19 02:03 , Processed in 0.063958 second(s), 25 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表