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读取图片EXIF信息类库介绍和使用实例
Jul 10 Python
Python实现求最大公约数及判断素数的方法
May 26 Python
Python实现统计代码行的方法分析
Jul 12 Python
Django使用Mysql数据库已经存在的数据表方法
May 27 Python
Python处理命令行参数模块optpars用法实例分析
May 31 Python
我用Python抓取了7000 多本电子书案例详解
Mar 25 Python
python调试神器PySnooper的使用
Jul 03 Python
Python简易版图书管理系统
Aug 12 Python
浅谈Python 递归算法指归
Aug 22 Python
Python3 Click模块的使用方法详解
Feb 12 Python
如何使用python socket模块实现简单的文件下载
Sep 04 Python
python小技巧——将变量保存在本地及读取
Nov 13 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开发文档 会员收费1期
2012/08/14 PHP
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
ThinkPHP模板Switch标签用法示例
2014/06/30 PHP
thinkPHP实现瀑布流的方法
2014/11/29 PHP
thinkphp5框架实现的自定义扩展类操作示例
2019/05/16 PHP
laravel 出现command not found问题的解决方案
2019/10/23 PHP
zeroclipboard复制到剪切板的flash
2010/08/04 Javascript
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
2010/11/28 Javascript
中文字符串截取的js函数代码
2013/04/17 Javascript
Extjs NumberField后面加单位实现思路
2013/07/30 Javascript
IE6已终止操作问题的2种情况及解决
2014/04/23 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
2017/03/17 Javascript
微信小程序之购物车功能
2020/09/23 Javascript
jQuery实现简单的滑动导航代码(移动端)
2017/05/22 jQuery
AngularJs 最新验证手机号码的实例,成功测试通过
2017/11/26 Javascript
js屏蔽退格键(backspace或者叫后退键与F5)
2019/02/10 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
详解Vue中使用插槽(slot)、聚类插槽
2019/04/12 Javascript
Flutter 超实用简单菜单弹出框 PopupMenuButton功能
2019/08/06 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
Vue3 的响应式和以前有什么区别,Proxy 无敌?
2020/05/20 Javascript
vue实现整屏滚动切换
2020/06/29 Javascript
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
Python函数的周期性执行实现方法
2016/08/13 Python
python实现的正则表达式功能入门教程【经典】
2017/06/05 Python
pycharm下查看python的变量类型和变量内容的方法
2018/06/26 Python
shell程序中如何注释
2012/01/28 面试题
文明村镇申报材料
2014/05/06 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
2014年安全员工作总结
2014/11/13 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
节水宣传标语口号
2015/12/26 职场文书
浅谈MySql整型索引和字符串索引失效或隐式转换问题
2021/11/20 MySQL
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技