Python self用法详解


Posted in Python onNovember 28, 2020

在定义类的过程中,无论是显式创建类的构造方法,还是向类中添加实例方法,都要求将 self 参数作为方法的第一个参数。例如,定义一个 Person 类:

class Person:
  def __init__(self):
    print("正在执行构造方法")
  # 定义一个study()实例方法
  def study(self):
    print(self,"正在学Python")
zhangsan = Person()
zhangsan.study()
lisi = Person()
lisi.study()

那么,self 到底扮演着什么样的角色呢?接下来将对 self 参数做详细的介绍。

事实上,Python 只是规定,无论是构造方法还是实例方法,最少要包含一个参数,并没有规定该参数的具体名称。之所以将其命名为 self,只是程序员之间约定俗成的一种习惯,遵守这个约定,可以使我们编写的代码具有更好的可读性(大家一看到 self,就知道它的作用)。

那么,self 参数的具体作用是什么呢?打个比方,如果把类比作造房子的图纸,那么类实例化后的对象是真正可以住的房子。根据一张图纸(类),我们可以设计出成千上万的房子(类对象),每个房子长相都是类似的(都有相同的类变量和类方法),但它们都有各自的主人,那么如何对它们进行区分呢?

当然是通过 self 参数,它就相当于每个房子的门钥匙,可以保证每个房子的主人仅能进入自己的房子(每个类对象只能调用自己的类变量和类方法)。

如果你接触过其他面向对象的编程语言(例如 C++),其实 Python 类方法中的 self 参数就相当于 C++ 中的 this 指针。

也就是说,同一个类可以产生多个对象,当某个对象调用类方法时,该对象会把自身的引用作为第一个参数自动传给该方法,换句话说,Python 会自动绑定类方法的第一个参数指向调用该方法的对象。如此,Python解释器就能知道到底要操作哪个对象的方法了。

因此,程序在调用实例方法和构造方法时,不需要手动为第一个参数传值。例如,更改前面的 Person 类,如下所示:

class Person:
  def __init__(self):
    print("正在执行构造方法")
  # 定义一个study()实例方法
  def study(self):
    print(self,"正在学Python")
zhangsan = Person()
zhangsan.study()
lisi = Person()
lisi.study()

上面代码中,study() 中的 self 代表该方法的调用者,即谁调用该方法,那么 self 就代表谁。因此,该程序的运行结果为:

正在执行构造方法
<__main__.Person object at 0x0000021ADD7D21D0> 正在学Python
正在执行构造方法
<__main__.Person object at 0x0000021ADD7D2E48> 正在学Python

另外,对于构造函数中的 self 参数,其代表的是当前正在初始化的类对象。举个例子:

class Person:
  name = "xxx"
  def __init__(self,name):
    self.name=name
 
zhangsan = Person("zhangsan")
print(zhangsan.name)
lisi = Person("lisi")
print(lisi.name)

运行结果为:

zhangsan
lisi

可以看到,zhangsan 在进行初始化时,调用的构造函数中 self 代表的是 zhangsan;而 lisi 在进行初始化时,调用的构造函数中 self 代表的是 lisi。

值得一提的是,除了类对象可以直接调用类方法,还有一种函数调用的方式,例如:

class Person:
  def who(self):
    print(self)
zhangsan = Person()
#第一种方式
zhangsan.who()
#第二种方式
who = zhangsan.who
who()#通过 who 变量调用zhangsan对象中的 who() 方法

运行结果为:

<__main__.Person object at 0x0000025C26F021D0>
<__main__.Person object at 0x0000025C26F021D0>

显然,无论采用哪种方法,self 所表示的都是实际调用该方法的对象。

总之,无论是类中的构造函数还是普通的类方法,实际调用它们的谁,则第一个参数 self 就代表谁。

以上就是Python self用法详解的详细内容,更多关于Python self用法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python中list循环语句用法实例
Nov 10 Python
python实现在sqlite动态创建表的方法
May 08 Python
python提取页面内url列表的方法
May 25 Python
python制作花瓣网美女图片爬虫
Oct 28 Python
详解Python开发中如何使用Hook技巧
Nov 01 Python
解决每次打开pycharm直接进入项目的问题
Oct 28 Python
PyCharm设置护眼背景色的方法
Oct 29 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
Feb 18 Python
python__name__原理及用法详解
Nov 02 Python
python文件操作的简单方法总结
Nov 07 Python
Python with语句用法原理详解
Jul 03 Python
python获取时间戳的实现示例(10位和13位)
Sep 23 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
Nov 28 #Python
python安装sklearn模块的方法详解
Nov 28 #Python
Django-silk性能测试工具安装及使用解析
Nov 28 #Python
python 实现学生信息管理系统的示例
Nov 28 #Python
最新Python idle下载、安装与使用教程图文详解
Nov 28 #Python
Python3 用什么IDE开发工具比较好
Nov 28 #Python
Pycharm配置autopep8实现流程解析
Nov 28 #Python
You might like
PHP中Header使用的HTTP协议及常用方法小结
2014/11/04 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
2010/12/02 Javascript
jQuery-Tools-overlay 使用介绍
2012/07/14 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
2016/07/14 Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
2017/01/05 Javascript
微信小程序实现图片预加载组件
2017/01/18 Javascript
jQuery实现页面倒计时并刷新效果
2017/03/13 Javascript
详解webpack + react + react-router 如何实现懒加载
2017/11/20 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
通过实践编写优雅的JavaScript代码
2019/05/30 Javascript
layer弹出层自定义提交取消按钮的例子
2019/09/10 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
el-form 多层级表单的实现示例
2020/09/10 Javascript
[01:57]2018DOTA2亚洲邀请赛赛前采访-iG
2018/04/03 DOTA
[06:53]2018DOTA2国际邀请赛寻真——为复仇而来的Newbee
2018/08/15 DOTA
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
python实现数通设备端口监控示例
2014/04/02 Python
Windows中安装使用Virtualenv来创建独立Python环境
2016/05/31 Python
获取python的list中含有重复值的index方法
2018/06/27 Python
Python绘制二维曲线的日常应用详解
2019/12/04 Python
python关于变量名的基础知识点
2020/03/03 Python
4行Python代码生成图像验证码(2种)
2020/04/07 Python
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
波兰购物网站:MALL.PL
2019/05/01 全球购物
学生评语大全
2014/04/18 职场文书
多媒体编辑专业毕业生求职信
2014/06/13 职场文书
政府班子四风问题整改措施思想汇报
2014/10/08 职场文书
学雷锋倡议书
2015/01/19 职场文书
专项资金申请报告
2015/05/15 职场文书
MySQL实战记录之如何快速定位慢SQL
2022/03/23 MySQL
动视暴雪取消疫苗禁令 让所有员工返回线下工作
2022/04/03 其他游戏