1、Python中self的含义

self,英文单词意思很明显,表示自己,本身。

此处有几种潜在含义:

1.这里的自己,指的是,实例Instance本身。

2.同时, 由于说到“自己”这个词,都是和相对而言的“其他”而说的;而此处的其他,指的是,类Class,和其他变量,比如局部变量,全局变量等。

此处的self,是个对象(Object),是当前类的实例。

因此,对应的self.valueName 和 self.function()中的valueName:表示self对象,即实例的变量。与其他的,Class的变量,全局的变量,局部的变量,是相对应的。

function:表示是调用的是self对象,即实例的函数。与其他的全局的函数,是相对应的。

2、Python中为何要有self

那就是:

在类的代码(函数)中,需要访问当前的实例中的变量和函数的,即,访问Instance中的:

对应的变量(属性,property):Instance.ProperyNam,去读取之前的值和写入新的值

调用对应函数(function):Instance.function(),即执行对应的动作

-> 而需要访问实例的变量和调用实例的函数,当然需要对应的实例Instance对象本身

-> 而Python中就规定好了,函数的第一个参数,就必须是实例对象本身,并且建议,约定俗成,把其名字写为self

-> 所以,我们需要self(需要用到self)

而如果没有用到self,即代码中,去掉self后,那种写法所使用到的变量,实际上不是你所希望的,不是真正的实例中的变量和函数,而是的访问到了其他部分的变量和函数了。甚至会由于没有合适的初始化实例变量,而导致后续无法访问的错误。

下面,就通过代码,来演示,如果去掉self,或者没有合理的使用self,会出现哪些错误。

3、首先来看一下__init__()和self对象

可以看出self为实例变量p,是一个Person类型的对象。

以下是d = Dog('LiChuang',"京巴")实例化的示意图:

4、如果没有在__init__中初始化对应的实例变量的话,导致后续引用实例变量会出错

如下代码,完整的演示了,如果没有在类Class的最初的__init__函数中,正确的初始化实例变量,则会导致后续没有变量可用,因而出现AttributeError的错误:

从上述代码可见,由于在类的初始化(实例化)的__init__函数中,没有给self.name设置值,使得实例中,根本没有name这个变量,导致后续再去访问self.name,就会出现AttributeError的错误了。

对应的,如果写成self.name,则意思就正确了,就是初始化的时候,给实例中新增加,并且正常设置了正确的值newPersionName了,所以后续再去通过self.name,就可以访问到,当前实例中正确的变量name了。

相应的正确写法的代码如下:

5、在函数中,使用对应的变量,虽然代码是可以运行的,但是实际上却是使用的,不是实例中的变量

有时候,虽然你写的代码,可以运行,但是使用到的变量,由于没有加self,实际上是用到的不是实例的变量,而是其他的变量。

此类问题,主要和Python中的变量的作用域有关,但是此处例子中,也和是否使用self有关:

其中,可见,此处开始__init__中,没有给self实例初始化对应的name,

而后面的函数sayYourName中,虽然可以调用到self.name而没有出现AttributeError错误,

但是实际上此处的值,不是所期望的,传入的name,即"Tim",而是类中的name的值,即"class global name"。

python类中init_Python类中的__init__() 和 self 的解析相关推荐

  1. python继承 子类init_Python类继承:使用自己的和父的默认值和init方法进行动态子类初始化...

    我试图创建一个类系统,这些类可以用**kwargs初始化,并且每个字段都有默认值.下面是一些代码,表示我要做的事情:class Parent(object): #should only have p_ ...

  2. Python爬虫笔记——if __name__ == ‘__main__‘ 如何正确理解和__init__和self 的解析

    Python中if name == 'main':的作用和原理 Python中if name == 'main',__init__和self 的解析

  3. python中的__new__与__init__,新式类和经典类(2.x)

    在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A()) 新式类跟经典类的差别主要是以下几点: 1 ...

  4. python 元类的call_【原创】Python 对象创建过程中元类, __new__, __call__, __init__ 的处理...

    原始type: type是最原始的元类,其__call__方法是在你使用" t_class = type(classname_string, base_classes_tuple, attr ...

  5. python中的新式类与旧式类的一些基于descriptor的概念(下)

    3. Descriptor介绍 3.1 Descriptor代码示例 3.2 定义 3.3 Descriptor Protocol(协议) 3.4 Descriptor调用方法 4. 基于Descri ...

  6. python中的新式类与旧式类的一些基于descriptor的概念(上)

    python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...

  7. python中的类的成员变量以及property函数

    1 python类的各种变量 1.1 全局变量 在类外定义的变量. 1.2 类变量 定义在类里面,所有的函数外面的变量.这个变量只有一份,是所有的对象共有的.在类外用"类."来引用 ...

  8. python 类中定义类_Python中的动态类定义

    python 类中定义类 Here's a neat Python trick you might just find useful one day. Let's look at how you ca ...

  9. python中类和对象的内容_python中的类和对象

    摘要:本文主要介绍了python中的类和对象的基础内容.由于在c++中对类和对象已经有了较为深刻的认识,所以此部分就是主要熟悉一下创建方法和使用方法. 1.类.对象的创建和简单使用 主要观察创建类的方 ...

最新文章

  1. 量化指标公式源码_通达信实用指标:《看涨跌》指标公式源码
  2. 分享一个牛逼的 Java 开源后台管理系统,不要造轮子了!
  3. C++Merege Sort合并排序的实现算法(附完整源码)
  4. mysql中数据库覆盖导入的几种方式
  5. MCMS 基于SpringBoot 2架构
  6. android 管理activity
  7. MemCache详细介绍
  8. dxf geojson 转换_如何将Shapefile(Shp)文件转换为AutoCAD(Dwg、Dxf)文件?
  9. java万年历系统的设计,基于安卓Android平台万年历系统设计与实现
  10. unity3D 音效的设置 音效的开关 制作声音的开关按钮
  11. 五轴数控转台_RTCP、一次装夹、双转台……这是一份五轴应用说明书
  12. Dev-C++5.11实现愤怒的小鸟
  13. USACO健康的荷斯坦奶牛(DFS,二进制暴力枚举)
  14. mac-lol.tk syjc.html,苹果 MacBook Air笔记本一键u盘装系统win7教程
  15. 癸高血糖素——碳水化合物代谢的重要激素
  16. 什么?你还没女伴?教你如何借助Python俘获女孩子芳心
  17. 广州大学 操作系统实验之银行家算法
  18. C语言 将大写字母转换成相应的小写字母
  19. 一文解决,oracle显示ORA-01017
  20. 通过OpenNI2获取数据并转至OpenCV格式及点云生成

热门文章

  1. 48 行代码给 ABAP ALV 报表的数据行增添颜色效果
  2. SAP 电商云 Spartacus UI Angular Component 动态创建的单步调试
  3. Angular 开发里的 polyfills.js、runtime.js、styles.js 和 vendor.js 是用来做什么的
  4. 使用 TypeScript 自定义装饰器给类的方法增添监听器 Listener
  5. 如何在 SAP UI5 应用中集成第三方库 :一个在移动设备上查看 Web 应用打印调试信息的小技巧
  6. SAP Spartacus的登录验证机制 - user login Authentication
  7. SAP Spartacus里的HTTPErrorInterceptor的设计原理
  8. 一个风格诡异的ABAP学习网站
  9. SAP CDS view源代码行数统计工具
  10. 在Gradle里访问任务(task)的几种方式