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结合ImageMagick实现多张图片合并为一个pdf文件的方法
Apr 24 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
May 26 Python
python3之模块psutil系统性能信息使用
May 30 Python
Python中return self的用法详解
Jul 27 Python
django从请求到响应的过程深入讲解
Aug 01 Python
老生常谈python中的重载
Nov 11 Python
django echarts饼图数据动态加载的实例
Aug 12 Python
PyTorch 解决Dataset和Dataloader遇到的问题
Jan 08 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
May 18 Python
利用Python优雅的登录校园网
Oct 21 Python
Django websocket原理及功能实现代码
Nov 14 Python
Python MNIST手写体识别详解与试练
Nov 07 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修正代码
2011/05/09 PHP
PHP将整数数字转换为罗马数字实例分享
2019/03/17 PHP
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
javascript复制粘贴与clipboardData的使用
2014/10/16 Javascript
javascript遇到html5的一些表单属性
2015/07/05 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
2016/01/22 Javascript
jquery树形菜单效果的简单实例
2016/06/06 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
jQuery简单自定义图片轮播插件及用法示例
2016/11/21 Javascript
jQuery UI实现动画效果代码分享
2018/08/19 jQuery
AngularJS 监听变量变化的实现方法
2018/10/09 Javascript
小程序自定义模板实现吸顶功能
2020/01/08 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
[00:34]TI7不朽珍藏III——纯金地穴编织者饰品展示
2017/07/15 DOTA
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
2019/04/03 Python
python issubclass 和 isinstance函数
2019/07/25 Python
使用Pyhton 分析酒店针孔摄像头
2020/03/04 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
2020/03/18 Python
Pycharm修改python路径过程图解
2020/05/22 Python
Tensorflow全局设置可见GPU编号操作
2020/06/30 Python
python基本算法之实现归并排序(Merge sort)
2020/09/01 Python
CSS3属性box-sizing使用指南
2014/12/09 HTML / CSS
uniapp+Html5端实现PC端适配
2020/07/15 HTML / CSS
世界排名第一的运动鞋市场:Flight Club
2020/01/03 全球购物
Ariat英国官网:为世界顶级马术运动员制造最优质的鞋类和服装
2020/02/14 全球购物
nohup的用法
2014/08/10 面试题
中间件分为哪几类
2012/03/14 面试题
房屋改造计划书
2014/01/10 职场文书
加强作风建设心得体会
2014/10/22 职场文书
事业单位年度考核评语
2014/12/31 职场文书
考研导师推荐信范文
2015/03/27 职场文书
python中requests库+xpath+lxml简单使用
2021/04/29 Python
Pytorch中的数据集划分&正则化方法
2021/05/27 Python
Java使用HttpClient实现文件下载
2022/08/14 Java/Android
源码安装apache脚本部署过程详解
2022/09/23 Servers