第7.12节 可共享的Python类变量

一、    引言
在上节已经引入介绍了类变量和实例变量,类体中定义的变量为类变量,默认属于类本身,实例变量是实例方法中定义的self对象的变量,对于每个实例都是独有数据,而类变量是该类所有实例共享的属性和方法。

二、    类变量的定义方式
类变量的定义其实就是对变量赋值,有如下方式可以进行类变量的定义:
1.    在类体代码中,直接用变量名赋值。类体代码是在类定义时执行;
2.    在实例方法中(含构造方法和普通方法),直接用“类名.变量名”方式赋值;
3.    在类方法中,直接用“类名.变量名”或“cls.变量名”方式赋值,关于cls请参考下面“类方法”章节的解释;
4.    在类外调用方代码中直接用“类名.变量名”方式赋值。
注意:类变量无论是哪种方法定义后,会立即对该类所有实例对象产生影响,所有实例无论是类变量定义前就产生的实例还是类变量定义后的实例都可以访问该变量。

三、    类变量的访问方式
类变量的访问方式与类变量的定义方式有2点不同,一是因为类体代码仅在类定义时执行,因此不能在类定义后再通过类体代码访问,二是类变量可以在类外调用方通过实例方式访问。具体支持的访问方式如下:
1.    在实例方法中(含构造方法和普通方法),直接用“类名.变量名”方式访问;
2.    在类方法中,直接用“类名.变量名”方式访问;
3.    在类外调用方代码中直接用“类名.变量名”方式访问;
4.    在类外调用方代码中直接用“实例名.变量名”方式访问,注意这种方式不能用来直接赋值,只能读取,如果是赋值就变成了实例变量的定义。
从以上说明中,可以得知:
1.    类变量是可以在类定义的实例方法和类方法、以及类外调用时动态增加,并且一旦增加,对所有已经定义及后续需要新定义的实例变量都可见;
2.    程序通过对象访问类变量,其本质还是通过类名在访问类变量,但如果类变量和实例变量重名时,必须通过类名才能访问类变量。这是因为Python总是先到实例对象中查找属性,再到类属性中查找属性,有点类似局部变量和全局变量的关系;
3.    Python 允许通过对象访问类变量,但如果程序通过对象尝试对类变量赋值,此时性质就变了,Python 是动态语言,赋值语句往往意味着定义新的实例变量。因此,如果程序通过对象对类变量赋值,其实不是对“类变量赋值”,而是定义新的实例变量。

如果把类当成类命名空间,那么类变量其实就是定义在类命名空间内的变量, Python 可以使用类来读取、修改类变量。对于类变量而言,它们就是属于在类命名空间内定义的变量,因此程序不能直接访问这些变量,主要使用类名的方式来访问类变量,同时Python 完全允许使用实例对象来访问该对象所属类的类变量,但Python主要推荐使用类名访问类变量。因此老猿强烈建议大家使用类名访问类变量,使用实例方式访问很容易出错,大家可以结合下面的举例好好理解一下。

四、    举例
1、    定义一个类VarTest和实例,在类体代码中对类变量classvar赋值
class VarTest():
    classvar='classvar在类体代码赋值'
定义个实例:var=VarTest()
2、    查看相关变量的值
查看var.classvar和VarTest.classvar的值,都显示为:'classvar在类体代码赋值'
执行:var.classvar  is VarTest.classvar,返回True
3、    执行赋值语句
var.classvar='classvar在类外通过实例赋值'
4、    再次查看相关变量的值
此时查看var.classvar和VarTest.classvar的值,二者已经不同,一个是'classvar在类外通过实例赋值',一个是'classvar在类体代码赋值'
执行:var.classvar  is VarTest.classvar,返回False
相关代码执行截图:
 
5、    如果上面第3个步骤不是通过直接给变量赋值,而是先引用再赋值会怎么样?看下面代码的执行情况:
 
注本次新定义一个实例,可以看到最开始的var1.classvar和VarTest.classvar是同一个变量,执行var1.classvar+=的操作语句,这个语句的效果等同于“var1.classvar=var1.classvar+'   在类体外通过实例访问类变量'”
可以看到,执行后还是新定义了一个实例变量。

本节介绍了类变量的定义和使用方法,并举例进行了说明,虽然类变量的定义和访问可以通过实例方式进行,但老猿强烈推荐大家按类名方式进行定义和访问。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!

第7.12节 可共享的Python类变量相关推荐

  1. python类变量共享吗_第7.12节 可共享的Python类变量

    第7.12节 可共享的Python类变量 一.    引言 在上节已经引入介绍了类变量和实例变量,类体中定义的变量为类变量,默认属于类本身,实例变量是实例方法中定义的self对象的变量,对于每个实例都 ...

  2. [译] 12步轻松搞定python装饰器 - 简书

    [译] 12步轻松搞定python装饰器 - 简书 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需要你了解一些函数式编 ...

  3. Python高级特性: 12步轻松搞定Python装饰器

    12步轻松搞定Python装饰器 通过 Python 装饰器实现DRY(不重复代码)原则:  http://python.jobbole.com/84151/ 基本上一开始很难搞定python的装饰器 ...

  4. 12步轻松搞定 Python 装饰器

    12步轻松搞定 Python 装饰器 1. 函数 在python中,函数通过def关键字.函数名和可选的参数列表定义.通过return关键字返回值.我们举例来说明如何定义和调用一个简单的函数: > ...

  5. 深度学习模型的准备和使用教程,LSTM用于锂电池SOH预测(第一节)(附Python的jypter源代码)

    本Python笔记本显示和分析了如何处理NASA获得的电池充电/放电数据集. 对于这个模型的训练阶段,需要安装Python 3.x以及以下库: Tensorflow 2.0 Numpy Pandas ...

  6. 第12节 EWMA估计日波动率

    第12节 EWMA估计日波动率 12.1 简介 12.2 EWMA估计波动率算法 12.3 算法Python代码实现 12.4 计算示例 12.5 参考资料 12.1 简介 EWMA模型 考虑一市场变 ...

  7. tableau三轴合并_《Tableau数据可视化实战》——1.12节合并不同数据源-阿里云开发者社区...

    本节书摘来自华章社区<Tableau数据可视化实战>一书中的第1章,第1.12节合并不同数据源,作者(美)Ashutosh Nandeshwar,更多章节内容可以访问云栖社区"华 ...

  8. 巨划算|¥9.9拼12节美国外教课程,让你家娃像美国孩子一样学习英语!

    谈到优质的北美外教少儿英语在线课程 家长首先想到的是VIPKID,不是叮咚课堂 谈到要选性价比高的少儿英语课 家长会想到的可能是51Talk,也不是叮咚课堂 但要谈到最近兴起的AI英语课程 除了叮咚课 ...

  9. 《机器学习基石》第12节课学习笔记

    第12节课  Nonlinear Transformation 这节课主要介绍了非线性分类模型,通过非线性变换,将非线性模型映射到另一个空间,转换为线性模型,再来进行线性分类.本节课完整学习了非线性变 ...

最新文章

  1. 「吃鸡」之父自立门户!研发新沙盒游戏连接元宇宙
  2. 解决启动httpd报: apr_sockaddr_info_get() failed for错误
  3. python怎么加载图片-怎样用python加载dicom图片
  4. adb实时获取屏幕_实时数仓 | 你需要的是一款合适且强大的OLAP数据库(上)
  5. 链表反转python
  6. Myeclipse 操作数据库
  7. 《Web Load Testing For Dummie》读书笔记
  8. 最长上升子序列o(nlogn)复杂度一种简单易懂的理解
  9. 读吴恩达算-EM算法笔记
  10. python ddos 伪装_Python进行DDOS攻击
  11. Redis设计与实现学习总结
  12. 《啊哈算法》知识点总结
  13. nginx.conf中的fastcgi_pass
  14. Win2008:在 Win2008R2 中安装 PowerShell 4.0 (旧作)
  15. linux压缩与解压命令
  16. 采用AT89C2051的智能时钟
  17. 蓝图(blueprint)的理解和用法
  18. 怎样查看服务器操作系统密码,IIS提示:您未被授权查看该页 并弹出输入用户名密码Windows服务器操作系统 -电脑资料...
  19. 换脸方法之FaceShifter
  20. 动手学深度学习——矩阵求导之矩阵的迹和微分

热门文章

  1. 【重温基础算法】内部排序之快速排序法
  2. php中$_POST接收不到参数问题
  3. 人生不该困于五环之外
  4. 7-5 圆形体体积计算器 (20 分)
  5. 暗影精灵2pro安装win10+ubuntu16.10双系统
  6. 美国小学教育——转自顾小北
  7. 北京理工大学研究生计算机专业好考吗,北京理工大学计算机专业研究生的方向问题...
  8. CTF秀CRYPTO密码学签到
  9. 乐高ev3机器人打招呼流程代码呈现
  10. 抖音pop猫回收站设置教程