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

第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的世界。

欢迎大家批评指正,谢谢大家关注!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么一流成功人士的闹钟都定在早晨5:57?

对很多人来说,早晨时分是一天中最匆忙的时段。近年来,我在研究人们如何利用时间的过程中发现,市场上铺天盖地的媒体教你如何利用早晨的时间。 美国国家睡眠基金会发布的一项睡眠调查结果显示,在工作日的早晨,30-50岁的…

命令行小技巧

我们平时使用Linux的时候经常遇到这样一个问题,举例有这样一种情况:执行命令 $ cp /etc/apt/sources.list /etc/apt/sources.list.bak 这里面有个问题,明明 /etc/apt/sources 这几个字都是一样的,为什么要打两遍?这样的…

统计学习导论_统计机器学习之扫盲导论篇

机器学习之扫盲导论篇来都来了,不关注一下吗??人工智能是当下最火的词,而机器学习就是它的灵魂。现在超级多搞金融的人已经用到很深的机器学习模型了,更别提互联网企业的大佬们了,比如:(这是一篇…

linux环境下创建postgis数据库,linux下搭建postgresql、postgis、pg_pathman环境步骤详解...

操作系统:centOS6.6安装postgreSQL9.6.2安装命令:./postgresql-9.6.3-2-linux-x64.run之后按照图形界面操作安装,语言选择zh_CN UTF-8安装geos-3.6.0(会报错,暂时不用管)安装命令:tar xjvfgeos-3.6.0.tar.bz2cd geos-3…

[Abp 源码分析]异常处理

点击上方蓝字关注我们Abp 框架本身针对内部抛出异常进行了统一拦截,并且针对不同的异常也会采取不同的处理策略。在 Abp 当中主要提供了以下几种异常类型:异常类型描述AbpExceptionAbp 框架定义的基本异常类型,Abp 所有内部定义的异常类型都继…

phpstorm设置 打开文件所在目录_PDF文件在线分享并设置打开次数

公司有一些重要的PDF文档,怎么才能防止外泄?如何加密PDF文件防止被人复制了?怎样让PDF不能被别人拷贝啊? 这些问题困扰了一部分想让别人看pdf内容又担心别人泄露的人。本文用maipdf网站的例子来进行设置。首先我们打开maipdf的网站…

荐号 | 11个人工智能与大数据相关的个人、企业优质号

AlphaGo Zero都会自学了,作为刚刚步入AI大门的我们,应该如何选择合适自己的知识平台呢?今天小编为你甄选了几个高质量的技术公众号。 这些号更多的不是讲授枯燥的理论,而是从行业资讯、一线技术、应用案例、职场发展等多个角度分享…

以表达式作为参数传入SQL的存储过程中去

在开发过程中,需要把一句Sql 的expression作为一个参数传入Procedure中去。 在asp.net中,一个Search的动作,把用户所操作的搜索条件写成了一句表达式,现只需要把这句表达式传入存储过程中去,与存储过程中的Sql的Select…

围棋中的数学原理

围棋一向被誉为是人类大脑智慧的专利,围棋的走法,几乎和宇宙中原子数量相同,甚至更多,每回合有250种可能,一盘棋可以长达150个回合,共有1后面再加360个0种下法,这样的计算量,对计算机…

spring boot 缓存_Spring Boot 集成 Redis 实现数据缓存

Spring Boot 集成 Redis 实现数据缓存,只要添加一些注解方法,就可以动态的去操作缓存了,减少代码的操作。在这个例子中我使用的是 Redis,其实缓存类型还有很多,例如 Ecache、Mamercache、Caffeine 等。Redis 简介Redi…

.md是什么文件_Element-UI源码阅读之md显示到页面

入口文件首先,看一个项目的入口,可以从package.json中去看它的运行命令 可以看到dev那行,执行了很多脚本: npm run bootstrap && npm run build:file && cross-env NODE_ENVdevelopment webpack-dev-server --con…

linux误删ssh不上,误删openssh-server删除,复原操作

在别的节点上寻找openssh的程序有哪些:而我的这个节点上只有一个openssh-clines,所以,就先利用了yum install openssh-server进行安装,但是这个安装的是最新的 openssh-server-5.3p1-122.el6.x86_64.rpm,担心集群节点之…

我用 MySQL 干掉了一摞简历

临近过年,疫情又趋于平稳,最近出来面试的人也多了起来,我们公司也在招人。我发现,不少候选人,对数据库的认知还处在比较基础的阶段,以为会写“增删改查”、做表关联就足够了,那些工作中经常出现…

借用虚拟机在真机安装 ubuntu, 亦可安装至移动硬盘

说一下另一种硬盘安装的办法,借用虚拟机装在物理硬盘上,比较变态。0. 适用于机子里已经装了 windows 的朋友安装真正的 Ubuntu ,wubi 不在讨论之列。1. 下载并安装 vmware workstation for windows: [url]http://www.vmware.com/products/ws/…

为什么AI工程师成为当前薪资最高的技术岗位

今年无疑是“人工智能”话题火热指数最高的一年。从腾讯西雅图AI实验室,百度斥资超过200亿投入人工智能研发,再到最近 Google 打算在中国进行AI领域的市场扩张,其母公司 Alphabet 更是在7月便成立专注AI领域的风投机构...全球都在风生水起、将…

spring boot jar包_「Spring Boot 新特性」 jar 大小自动瘦身

自动分析瘦身Spring Boot 项目最终构建处理 JAR 包大小一直是个诟病,需要把所有依赖包内置最终输出可运行的 jar。当然可以使用其他的插件扩展 实现依赖 JAR 和 可运行 jar 分离可以参考 slot-maven-plugin[1], 但此种方法治标不治本并不能减少原有依赖的 JAR 的大小…

linux应用与管理,Linux操作系统应用与管理

本书从实际应用的角度出发,以RedHat Linux 9为操作环境,介绍了使用和管理Linux的各种常规操作和技巧。主要内容包括Linux的安装配置、桌面应用、文件目录管理、用户管理、网络管理、安全管理、进程管理、软件包的安装使用、更新Linux内核以及Linux下Java…

设计模式在项目中的应用案例_设计模式在项目中的应用(初学者版)

文章首发链接:设计模式在项目中的实际应用(应试版)​mp.weixin.qq.com本文适用于设计模式初学者。很多人学习了设计模式,但在项目开发中仍然不知道如何使用;很多小伙伴在课堂上跟着老师稀里糊涂的听了,懂了…

微创社001期:从0开始创作第一本技术书

互联网已经成为了人们生活中如饮水空气一般的基础设施,它不仅影响着当下我们的生活,也必将在更加普遍的领域影响着我们的未来。而在大浪潮中,坚守一个以自我为中心的知识体系,不仅有助于我们作为个体更好的从互联网汲取养分&#…

关于虚拟机下linux共享Windows文件的解决方案

先跟大家说一下在windows下装的vmware,就是又在vmware的系统里虚拟了一个Linux的系统的话,我们有些朋友就是想法把物理机的东西拷贝到Linux虚拟机里时很是伤神,当然windows就很简单了,直接拖进去(如果你安装了vmware t…