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 调用VC++的动态链接库(DLL)
Sep 06 Python
在Linux系统上部署Apache+Python+Django+MySQL环境
Dec 24 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
Feb 17 Python
Swift 3.0在集合类数据结构上的一些新变化总结
Jul 11 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
Mar 12 Python
Windows下python3.7安装教程
Jul 31 Python
python+selenium实现自动抢票功能实例代码
Nov 23 Python
Python 取numpy数组的某几行某几列方法
Oct 24 Python
TensorFlow索引与切片的实现方法
Nov 20 Python
提高python代码运行效率的一些建议
Sep 29 Python
python 实现IP子网计算
Feb 18 Python
Python使用pandas导入xlsx格式的excel文件内容操作代码
Dec 24 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 异常处理实现代码
2009/03/10 PHP
php中计算中文字符串长度、截取中文字符串的函数代码
2011/08/09 PHP
php防止网站被刷新的方法汇总
2014/12/01 PHP
统计出现最多的字符次数的js代码
2010/12/03 Javascript
js操作iframe父子窗体示例
2014/05/22 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
2016/08/05 Javascript
js中获取键盘事件的简单实现方法
2016/10/10 Javascript
jquery插入兄弟节点的操作方法
2016/12/07 Javascript
javascript删除html标签函数cIsHTML
2017/01/09 Javascript
vue.js选中动态绑定的radio的指定项
2017/06/02 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
jQuery+ajax实现批量删除功能完整示例
2019/06/06 jQuery
layui实现数据分页功能
2019/07/27 Javascript
js tab栏切换代码实例解析
2019/09/03 Javascript
[44:15]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第二局
2016/03/06 DOTA
Python中模块与包有相同名字的处理方法
2017/05/05 Python
Python读csv文件去掉一列后再写入新的文件实例
2017/12/28 Python
使用Django和Python创建Json response的方法
2018/03/26 Python
python爬虫 正则表达式解析
2019/09/28 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
2019/10/14 Python
python openCV自制绘画板
2020/10/27 Python
汉米尔顿手表官网:Hamilton
2020/09/13 全球购物
个人自我鉴定范文
2013/10/04 职场文书
妇产科护士自我鉴定
2013/10/15 职场文书
会计电算化应届生求职信
2013/11/03 职场文书
外贸销售员求职的自我评价
2013/11/23 职场文书
建议书标准格式
2014/03/12 职场文书
学员自我鉴定
2014/03/19 职场文书
学生保证书格式
2015/02/27 职场文书
2015大学生入党个人自传
2015/06/26 职场文书
python中print格式化输出的问题
2021/04/16 Python
Python编程源码报错解决方法总结经验分享
2021/10/05 Python
利用Python实时获取steam特惠游戏数据
2022/06/25 Python