第7.5节 揭开Python类中self的面纱
在上节已经引入介绍了类定义,并简单介绍了类变量、实例变量、类方法和实例方法,后面章节还会进一步详细介绍相关的内容。本节要介绍的self是与类变量、实例变量、类方法和实例方法具体定义实现强相关的。
一、什么是self?
在Python中self实际上是指向类声明的实例对象自身,如果要在实例方法中访问实例变量,必须在变量前加“self.”。显然,self很有用,甚至必不可少。如果没有它,所有的方法都无法访问对象本身的属性。
二、 self的使用
1. 定义实例方法时,self必须是方法的第一个参数,这种类的方法定义中传递第一个参数为self的方法即使实例方法;
2. self代表类的实例,而非类,而self.__class__则指向类, self在定义时不可以省略;
3. 在实例化方法调用时,程序不用将调用方的实例作为参数放到调用方法的实参里,而是由Python自动进行处理,自动将实例对象传递给实例方法。以上节的Duck类作为例子,其三个方法定义时都有self作为参数,但在实例对象调用swim的代码中却无参数。;
4. 实例方法访问实例变量时,必须通过self访问,否则赋值语句会被认为是给方法的局部变量赋值,非赋值语句会报变量没有定义;
5. 类的实例变量可以通过“实例名.属性”的在实例方法和类外面直接访问。
1) 有个例外,变量名如果是两个下划线开头,则无法这样直接访问。
2) 两个下划线开头的变量,可以通过变量名前加一个下划线+和类名的方式访问。例如如果在Duck类内定义了一个实例变量:”__weight”,实际访问时可以通过”实例名._Duck__weight”的变量名访问。但这种方式不是Python推荐的,老猿也不推荐;
3) 这种加两个下划线的变量类似于c++的私有变量,其访问应该通过实例方法访问,否则对于未知类实现方式的实例直接访问可能引发未知的错误;
6. 如果类的方法中没有self参数,在类的方法定义和调用时均不传类实例是可以的,这样的方法就是类方法和静态方法;
7. “self”这个名字并不是Python强制的名字,只是一种约定俗成,实际上你完全可以起个别的任意名字,如“this”、“me”、“aaa”等,实际上不同实例方法中这个名字都可以不一致,如在构造函数中叫“self1”,在析构函数中叫“self2”,在其他实例方法叫不同的任意名称都可以,但是Python都会作为对象自身处理,并能正确访问,但为了大家方便理解,还是建议大家叫self。使用一个标准的名称有很多优点——你的程序读者可以迅速识别它,如果使用self的话,还有些IDE(集成开发环境)也可以帮助你。
最后有个问题,Python中实例方法第一个参数是“self”,但它又是可以任意命名的,那怎么知道第一个参数是不是实例方法要的self呢?或者说怎么知道这个方法是不是实例方法呢?大家想一想,答案将在后面章节揭晓。
本节介绍了Python中类中神秘的self,有关内容涉及面较广,但实际上理解之后也就比较简单。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!
第7.5节 揭开Python类中self的面纱的更多相关文章
- 第8.34节 《Python类中常用的特殊变量和方法》总结
本章介绍了Python类中常用的特殊变量和方法,这些特殊变量和方法都有特殊的用途,是Python强大功能的基石之一,许多功能非常有Python特色.由于Python中一切皆对象,理解这些特殊变量和方法 ...
- 第8.26节 重写Python类中的__getattribute__方法实现实例属性访问捕获
一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...
- 第7.14节 Python类中的实例方法详析
第7.14节 Python类中的实例方法详析 一. 实例方法的定义 在本章前面章节已经介绍了类的实例方法,实例方法的定义有三种方式: 1. 类体中定义实例方法 第一种方式很简单,就是在类体 ...
- 第8.12节 Python类中使用__dict__定义实例变量和方法
上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...
- 第8章 Python类中常用的特殊变量和方法目录
第8章 Python类中常用的特殊变量和方法 第8.1节 Python类的构造方法__init__深入剖析:语法释义 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8. ...
- 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法
第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一. 案例说明 本节定义了类Sta ...
- 第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析
第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析 静态方法也是通过类定义的一种方法,一般将不需要访问类属性但是类需要具有的一些能力可以静态方法提供. 一 ...
- 第8.6节 Python类中的__new__方法深入剖析:调用父类__new__方法参数的困惑
上节<第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解>通过案例详细分析了两个方法的执行顺序,不知大家是否注意到了,在上述 ...
- Python类中super()和__init__()的关系
Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...
随机推荐
- JSP系列记录
JSP就是可以实现在html中写Java代码 例: hello.jsp <%@page contentType="text/html; charset=UTF-8" page ...
- GAMES101系列笔记一 图形学概述与线性代数入门
概述+线性代数 为什么学习图形学? Computer Graphics is AWESOME! 主要涉及内容: 光栅化 曲线和网格 光线追踪 动画与模拟 Differences between CG ...
- C++ 数据结构 2:栈和队列
1 栈 1.1 栈的基本概念 栈(stack)又名堆栈,它是一种 运算受限的线性表.限定 仅在表尾进行插入和删除操作 的线性表.表尾被称为栈顶,相对地,把另一端称为栈底. 1.1.1 特点 它的特殊之 ...
- git引入_版本控制介绍
八个字形容git技术: 公司必备,一定要会 一.git概念: git是一个免费的,开源的分布式版本控制系统,可以快速高效的处理从小型到大型的项目 二.什么是版本控制: 版本控制是一种一个记录一个或若个 ...
- 弹性盒模型flex-grow的计算
flex-grow属性是弹性盒布局模块的子属性. 它定义了弹性项目在必要时增长的能力. 它接受作为比例的无单位值. 它决定了项目应在伸缩容器内部占用多少可用空间. 例如,如果所有项目的flex-gro ...
- 变强——GitHub 热点速览 Vol.46
作者:HelloGitHub-小鱼干 网络不通怎么办?Ping 就是你的调试大招,而 gping 则是 Ping 的内功,终端可视化显示 Ping 结果,一眼看明数据接收情况.前端调试大招又是什么呢? ...
- sklearn.tree.DecisionTreeClassifier 详细说明
sklearn.tree.DecisionTreeClassifier()函数用于构建决策树,默认使用CART算法,现对该函数参数进行说明,参考的是scikit-learn 0.20.3版本. ...
- java中elasticsearch7.x关于nested类型的api使用,新增+更新
0,定义esHighClient 1 @Configuration 2 public class RestClientConfig { 3 4 //类似:200.188.22.20:9300,200. ...
- 宕机了,Redis数据丢了怎么办?
持续原创输出,点击上方蓝字关注我 目录 前言 什么是AOF? 三种写回策略 日志文件太大怎么办? AOF重写会阻塞主线程吗? AOF的缺点 总结 什么是RDB? 给哪些数据做快照? 快照时能够修改数据 ...
- 常见web漏洞修复方法
方法如下: 漏洞修复.(输入过滤,输出转义) 1.在连接数据库时,在接收参数后进行转义,$id = mysql_real_escape_string($id); 2.在网页源码中在接收参数后可用htm ...