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字符串排序方法
Aug 29 Python
利用Python绘制MySQL数据图实现数据可视化
Mar 30 Python
在Django的上下文中设置变量的方法
Jul 20 Python
Python 获取当前所在目录的方法详解
Aug 02 Python
python cx_Oracle的基础使用方法(连接和增删改查)
Nov 19 Python
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
Feb 22 Python
安装python及pycharm的教程图解
Oct 10 Python
详解python环境安装selenium和手动下载安装selenium的方法
Mar 17 Python
浅析Python中字符串的intern机制
Oct 03 Python
自己搭建resnet18网络并加载torchvision自带权重的操作
May 13 Python
浅谈Python 中的复数问题
May 19 Python
python图片灰度化处理的几种方法
Jun 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
AM/FM收音机的安装与调试
2021/03/02 无线电
Zend Framework动作助手Url用法详解
2016/03/05 PHP
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
仿微博字符限制效果实现代码
2012/04/20 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
2013/10/23 Javascript
javascript函数重载解决方案分享
2014/02/19 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
JavaScript中的函数(二)
2015/12/23 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
2016/11/09 Javascript
值得分享的JavaScript实现图片轮播组件
2016/11/21 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
vue-router实现tab标签页(单页面)详解
2017/10/17 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
2018/05/01 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
2018/09/29 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
Linux下编译安装MySQL-Python教程
2015/02/02 Python
PyMongo安装使用笔记
2015/04/27 Python
Python数据分析之真实IP请求Pandas详解
2016/11/18 Python
使用pandas实现csv/excel sheet互相转换的方法
2018/12/10 Python
详解Python 调用C# dll库最简方法
2019/06/20 Python
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
python如何把字符串类型list转换成list
2020/02/18 Python
基于pandas向csv添加新的行和列
2020/05/25 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
2020/06/16 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
如何用Lucene索引数据库
2016/02/23 面试题
UNIX文件系统常用命令
2012/05/25 面试题
广告语设计及教案
2014/03/21 职场文书
汽车销售员工作总结
2015/08/12 职场文书
多人股份制合作协议书
2016/03/19 职场文书
公司晚会主持词
2019/04/17 职场文书
python 自动化偷懒的四个实用操作
2021/04/11 Python
Python+SeaTable实现计算两个日期间的工作日天数
2022/07/07 Python