python self用法详解

对于在类体中定义的实例方法,Python 会自动绑定方法的第一个参数(通常建议将该参数命名为 self),第一个参数总是指向调用该方法的对象。根据第一个参数出现位置的不同,第一个参数所绑定的对象略有区别:

在构造方法中引用该构造方法正在初始化的对象。

在普通实例方法中引用调用该方法的对象。

由于实例方法(包括构造方法)的第一个 self 参数会自动绑定,因此程序在调用普通实例方法、构造方法时不需要为第一个参数传值。

self 参数(自动绑定的第一个参数)作用就是引用当前方法的调用者,比如前面介绍的在构造方法中通过 self 为该对象增加实例变量。也可以在一个实例方法中访问该类的另一个实例方法或变量。假设定义了一个 Dog 类,这个 Dog 对象的 run() 方法需要调用它的 jump() 方法,此时就可通过 self 参数作为 jump() 方法的调用者。

方法的第一个参数所代表的对象是不确定的,但它的类型是确定的,即它所代表的只能是当前类的实例;只有当这个方法被调用时,它所代表的对象才被确定下来谁在调用这个方法,方法的第一个参数就代表谁。

例如定义如下 Dog 类:

class Dog:
    # 定义一个jump()方法
    def jump(self):
        print("正在执行jump方法")
    # 定义一个run()方法,run()方法需要借助jump()方法
    def run(self):
        # 使用self参数引用调用run()方法的对象
        self.jump()
        print("正在执行run方法")

上面代码的 run() 方法中的 self 代表该方法的调用者:谁在调用 run() 方法,那么 self 就代表谁。因此该方法表示:当一个 Dog 对象调用 run() 方法时,run() 方法需要依赖它自己的 jump() 方法。

当 Python 对象的一个方法调用另一个方法时,不可以省略 self。也就是说,将上面的 run()方法改为如下形式是不正确的:

# 定义一个run()方法,run()方法需要借助jump()方法
def run():
    #省略self,下面代码会报错
    self.jump()
    print("正在执行run方法")

此外,在构造方法中,self 参数(第一个参数)代表该构造方法正在初始化的对象。例如如下代码:

class InConstructor :
    def __init__(self) :
        # 在构造方法里定义一个foo变量(局部变量)
        foo = 0
        # 使用self代表该构造方法正在初始化的对象
        # 下面的代码将会把该构造方法正在初始化的对象的foo实例变量设为6
        self.foo = 6
# 所有使用InConstructor创建的对象的foo实例变量将被设为6
print(InConstructor().foo) # 输出6

在 InConstructor 的构造方法中,self 参数总是引用该构造方法正在初始化的对象。程序中将正在执行初始化的 InConstructor 对象的 foo 实例变量设为 6,这意味着该构造方法返回的所有对象的 foo 实例变量都等于 6。

需要说明的是,自动绑定的 self 参数并不依赖具体的调用方式,不管是以方法调用还是以函数调用的方式执行它,self 参数一样可以自动绑定。例如如下程序:

class User:
    def test(self):
        print('self参数: ', self)
       
u = User()
# 以方法形式调用test()方法
u.test() # <__main__.User object at 0x00000000021F8240>
# 将User对象的test方法赋值给foo变量
foo = u.test
# 通过foo变量(函数形式)调用test()方法。
foo() # <__main__.User object at 0x00000000021F8240>

上面程序中第 5 行代码以方法形式调用 User 对象的 test() 方法,此时方法调用者当然会自动绑定到方法的第一个参数(self 参数);程序中第 11 行代码以函数形式调用 User 对象的 test() 方法,看上去此时没有调用者了,但程序依然会把实际调用者绑定到方法的第一个参数,因此输出结果完全相同。

当 self 参数作为对象的默认引用时,程序可以像访问普通变量一样来访问这个 self 参数,甚至可以把 self 参数当成实例方法的返回值。看下面程序:

class ReturnSelf :
    def grow(self):
        if hasattr(self, 'age'):
            self.age += 1
        else:
            self.age = 1
        # return self返回调用该方法的对象
        return self
rs = ReturnSelf()
# 可以连续调用同一个方法
rs.grow().grow().grow()
print("rs的age属性值是:", rs.age)

从上面程序中可以看出,如果在某个方法中把 self 参数作为返回值,则可以多次连续调用同一个方法,从而使得代码更加简洁。但是这种把 self 参数作为返回值的方法可能会造成实际意义的模糊,例如上面的 grow 方法用于表示对象的生长,即 age 属性的值加 1,实际上不应该有返回值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/257498.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue npm install 报错处理

一。Error: Cant find Python executable "python", you can set the PYTHON env variable 解决办法&#xff1a; 1、安装windows-build-tools npm install --global --production windows-build-tools2.安装node-gyp npm install --global node-gyp

云渲染农场如何付费使用?动画、效果图都一般怎么收费得?

许多刚入门计算机图形学的朋友可能会疑问&#xff0c;为何在渲染过程中需要借助云渲染服务&#xff0c;以及为何这些服务不是免费的。简单来讲&#xff0c;就是因为渲染工作量庞大&#xff0c;本机处理能力有限。设计和动画行业日渐将云渲染视为基本开支&#xff0c;这是因为数…

linux机器下/etc/hosts和/etc/resolv.conf文件解析

文章目录 1. /etc/resolv.conf1.1 概念1.2 配置1.3 用途 2. /etc/hosts2.1 概念2.2 配置2.3 两者优先级对比 1. /etc/resolv.conf 1.1 概念 DNS客户机的配置文件&#xff0c;用于设置DNS服务器的IP地址及DNS域名&#xff0c;还包含了主机的域名搜索顺序。该文件是由域名解析器…

5. Prism系列之区域管理器

Prism系列之区域管理器 文章目录 Prism系列之区域管理器一、区域管理器二、区域创建与视图的注入1. ViewDiscovery2. ViewInjection 三、激活与失效视图1. Activate和Deactivate2. 监控视图激活状态3. Add和Remove 四、自定义区域适配器1. 创建自定义适配器2. 注册映射3. 创建区…

【map】【单调栈 】LeetCode768: 最多能完成排序的块 II

作者推荐 【贪心算法】【中位贪心】.执行操作使频率分数最大 涉及知识点 单调栈 排序 map 区间合并 题目 给你一个整数数组 arr 。 将 arr 分割成若干 块 &#xff0c;并将这些块分别进行排序。之后再连接起来&#xff0c;使得连接的结果和按升序排序后的原数组相同。 返回…

Java 实现汉字转拼音带音调

代码 import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType; import net.sourcefo…

Linux学习笔记-Ubuntu下ssh服务器连接异常Connection reset

文章目录 一、问题问题现象1.1 连接重置无法访问的的问题1.2 查看服务器连接状态1.3 使用调试模式查看的信息 二、临时解决方法三、从根源解决问题3.1 问题分析3.2 服务器的ssh日志3.3 修改ssh配置禁止root登录3.4 配置允许所有ip访问3.5 修改认证方法3.6 再找原因 角色&#x…

Java生成带log的二维码

生成二维码案例 1.引入依赖 <!-- zxing生成二维码 --> <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version> </dependency><dependency><groupId>co…

无锡市某厂区工人上岗未穿工作服,殒命车间 富维AI守护每位工友

2018年12月23日&#xff0c;凌晨6点半左右&#xff0c;江阴华士某铜业公司轧球车间内&#xff0c;独自上夜班的操作工朱某正在操作行车吊运一筐切好的铜粒&#xff0c;吊运完成后&#xff0c;他开始解除料筐上的吊具。就在这时&#xff0c;意外突然发生&#xff0c;他身上穿着的…

C++学习笔记(十六)

一、多态 1. 多态的基本概念 多态是C面向对象三大特性之一 多态分为两类 1. 静态多态&#xff1a;函数重载 和 运算符重载属于静态多态&#xff0c;复用函数名 2. 动态多态&#xff1a;派生类和虚函数实现运行时多态 静态多态和动态多态区别&#xff1a; 1. 静态多态的函…

STM32单片机项目实例:基于TouchGFX的智能手表设计(5)硬件驱动层程序设计

STM32单片机项目实例&#xff1a;基于TouchGFX的智能手表设计&#xff08;5&#xff09;硬件驱动层程序设计 目录 一、 概述 二、 新建工程与外设配置 三、 TouchGFX配置 四、 增加TouchGFX关键驱动 一、 概述 本文内容主要进行工程新建&#xff0c;硬件外设的配置以及添加…

用webstorm学习Vue的时候提示未解析的变量或类型怎么办?

用webstorm学习Vue的时候&#xff0c;很多同学是不是对以下这种提示看着不舒服 这种提示因为webstorm在解析代码进行提示的时候会把html文件中css选择器进行缓存&#xff0c;如果你在同一个文件夹下面写很多个html&#xff0c;并且多个html中都有同样的<div id"root&qu…

用23种设计模式打造一个cocos creator的游戏框架----(二十一)组合模式

1、模式标准 模式名称&#xff1a;组合模式 模式分类&#xff1a;结构型 模式意图&#xff1a;将对象组合成树型结构以表示“部分-整体”的层次结构。Composite 使得用户对单个对象和组合对象的使用具有一致性。 结构图&#xff1a; 适用于&#xff1a; 1、想表示对象的部分…

RK3399平台开发系列讲解(内核入门篇)网络协议的分层

🚀返回专栏总目录 文章目录 一、应用层二、传输层三、网络层四、数据链路层(Data Link Layer)五、物理层沉淀、分享、成长,让自己和他人都能有所收获!😄 📢对于多数的应用和用户而言,使用互联网的一个基本要求就是数据可以无损地到达。用户通过应用进行网络通信࿰

leetcode每日一题打卡

leetcode每日一题 746.使用最小花费爬楼梯162.寻找峰值1901.寻找峰值Ⅱ 从2023年12月17日开始打卡~持续更新 746.使用最小花费爬楼梯 2023/12/17 代码 解法一 class Solution {public int minCostClimbingStairs(int[] cost) {int n cost.length;int[] dp new int[n1];dp[…

《每天一分钟学习C语言·一》

1、转义字符&#xff1a;\n换行&#xff0c;\t前进一个tab键&#xff0c;\b退格键 2、八进制前面有0&#xff0c;%o或者%#o表示八进制&#xff0c;十六进制前有0X&#xff0c;%0x或者%#0x表示十六进制 3、%u打印无符号数&#xff0c;%g显示小数&#xff0c;类似于%f&#xff…

cleanmymac有必要买吗 macbook空间不足怎么办 清理macbook磁盘空间

大家早上好&#xff0c;中午好&#xff0c;下午好&#xff0c;晚上好。 文章有点长&#xff0c;建议先收藏。 macbook是一款非常受欢迎的笔记本电脑&#xff0c;它拥有优秀的性能和设计&#xff0c;但是也有一个常见的问题&#xff0c;就是磁盘空间不足。如果你的macbook经常…

python之pyQt5实例:二维码生成与读取

目录 1、显示逻辑 2、业务逻辑 二维码的产生历史可以追溯到20世纪80年代。当时&#xff0c;日本Denso Wave公司为了追踪汽车零部件的运输和销售情况&#xff0c;开发了一种能够存储大量信息的条形码&#xff0c;这就是二维码的前身。到了20世纪90年代&#xff0c;随着手机和照…

SG3524控制的恒流源电路图

SG3524简介 SG3524是开关电源脉宽调制型控制器。应用于开关稳压器&#xff0c;变压器耦合的直流变换器&#xff0c;电压倍增器&#xff0c;极性转换器等。采用固定频率&#xff0c;脉冲宽度调制&#xff08;脉宽调制&#xff09;技术。输出允许单端或推挽输出。芯片电路包括电…

20、WEB攻防——PHP特性缺陷对比函数CTF考点CMS审计实例

文章目录 一、PHP常用过滤函数&#xff1a;1.1 与1.2 md51.3 intval1.4 strpos1.5 in_array1.6 preg_match1.7 str_replace CTFshow演示三、参考资料 一、PHP常用过滤函数&#xff1a; 1.1 与 &#xff1a;弱类型对比&#xff08;不考虑数据类型&#xff09;&#xff0c;甚至…