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 相关文章推荐
wxPython中文教程入门实例
Jun 09 Python
Python生成不重复随机值的方法
May 11 Python
python @property的用法及含义全面解析
Feb 01 Python
Python 最大概率法进行汉语切分的方法
Dec 14 Python
python 与服务器的共享文件夹交互方法
Dec 27 Python
OpenCV搞定腾讯滑块验证码的实现代码
May 18 Python
django云端留言板实例详解
Jul 22 Python
Python:type、object、class与内置类型实例
Dec 25 Python
Tensorflow 卷积的梯度反向传播过程
Feb 10 Python
将自己的数据集制作成TFRecord格式教程
Feb 17 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
Jun 24 Python
Python实现视频自动打码的示例代码
Apr 08 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
1.PHP简介
2006/10/09 PHP
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
解析php中获取系统信息的方法
2013/06/25 PHP
vmware linux系统安装最新的php7图解
2019/04/14 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
2020/04/06 PHP
JavaScript中的Array对象使用说明
2011/01/17 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
JavaScript缓冲运动实现方法(2则示例)
2016/01/08 Javascript
JS遍历页面所有对象属性及实现方法
2016/08/01 Javascript
深入理解JavaScript创建对象的多种方式以及优缺点
2017/06/01 Javascript
vue2.0 + element UI 中 el-table 数据导出Excel的方法
2018/03/02 Javascript
vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例
2019/03/08 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
使用 UniApp 实现小程序的微信登录功能
2020/06/09 Javascript
js数组的基本使用总结
2021/01/18 Javascript
Python去除字符串两端空格的方法
2015/05/21 Python
详解Python迭代和迭代器
2016/03/28 Python
python爬虫获取淘宝天猫商品详细参数
2020/06/23 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
Django 简单实现分页与搜索功能的示例代码
2019/11/07 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
django 模型字段设置默认值代码
2020/07/15 Python
Python获取excel内容及相关操作代码实例
2020/08/10 Python
HTML5之WebGL 3D概述(上)—WebGL原生开发开启网页3D渲染新时代
2013/01/31 HTML / CSS
HTML5+CSS3绘制锯齿状的矩形
2016/03/01 HTML / CSS
Nordgreen美国官网:在线购买极简主义斯堪的纳维亚手表
2019/07/24 全球购物
通用C#笔试题附答案
2016/11/26 面试题
大学生自我鉴定范文模板
2014/01/21 职场文书
主要负责人任命书
2014/06/06 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
2015年党员承诺书
2015/01/21 职场文书
心得体会格式及范文
2016/01/25 职场文书
浅谈JS和Nodejs中的事件驱动
2021/05/05 NodeJs
Win10多屏显示如何设置?Win10电脑多屏显示设置操作方法
2022/07/07 数码科技