第7.12节 可共享的Python类变量

Python 中的 typing.ClassVar 详解 ClassVar 是 Python 中 typing 模块提供的一种类型注解工具,用于标记类变量(静态变量),帮助静态类型检查器区分类属性和实例属性。它不会改变运行时行为,仅用于类型提示。ClassVar 的主要用途包括共享配置、常量、dataclass 中排除实例字段等。与 @classmethod 和 @staticmethod 不同,ClassVar 关注的是数据级别的静态标记。常见误用包括在实例上赋值、省略类型参数、与 Final 一起使用等。正确使用 ClassVar 可以提高代码的可读性和类型安 阅读详情

第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.youkuaiyun.com/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!

Python进阶之类变量(类属性)和实例变量(实例属性) Python进阶之类变量(类属性)和实例变量(实例属性) 无论是类属性还是类方法,都无法像普通变量或者函数那样,在类的外部直接使用它们。可以将类看做一个独立的空间,则类属性其实就是在类体中定义的变量,类方法是在类体中定义的函数。 在类体中,根据变量定义的位置不同,以及定义的方式不同,类属性又可细分为以下 3 种类型: 一、类体中、所有函数之外:此范围定义的变量,称为类属性或类变量; 二、类体中,所有函数内部:以“self.变量名”的方式定义的变量,称为实例属性或实例变量; 三、类体中,所有函数内部:以“ 阅读详情

相关推荐

Go语言--接口(interface)

0 接口概念 接口本身是调用方和实现方均需要遵守的一种协议。接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。 Go语言中使用组合实现对象特性的描述。对象的内部使用结构体内嵌组合对象应该具有的特性,对外通过接口暴露能使用的特性。 Go语言的设计是非侵入式的设计,也就是说,一个具体类型实现接口不需要在语法上显式地声明,只要具体类型的方法集是接口方法集的超集,就代表该类型实现了接口,编译器在编译时会进行方法集的校验,从而知道哪个类型实现了哪个接口。 0.

yunfan 1572

[Python]成员变量与类变量

前几天偶然间踩坑后发现了python的类变量(ClassVar)有一个特性,使用成员变量(MemberVar)的调用形式self.varName调用的居然是类变量!这还不够,当有同名的成员变量self.varName**被定义且被赋值**后使用self.varName调用的将不再是类变量而是成员变量! 结论说起来可能有点绕,不如来看下这个例子: 例1. 类变量 class Func(): ...

HYJZ的博客 2079

Python线程中的全局变量

线程之间可共享全局变量 如果有修改,全看执行顺序。 多线程开发的时候共享全局变量会带来资源竞争效果。也就是数据不安全。 比如: x=1 def t1(num): global x for i in range(num): x+=1 print('t1..',x) def t2(num): global x for i in ran...

棠牧师的博客 4327

ClassVar

是一个由 dataclass 自动添加的类属性,它是一个字典,包含了 dataclass 中所有字段的信息(字段名和类型)。是 Python 类型提示(Type Hinting)中的一个表达式,它用于注解类变量的类型。用于注解类变量,表示该变量是一个字典,键为字符串,值为任意类型。它在 dataclass 中常用于注解。表示一个类变量,它的类型是字典。这个字典的键是字符串,值可以是任意类型。类型提示只是用于静态类型检查,不会在运行时强制限制变量的类型。属性,用于存储 dataclass 字段的信息。

The cure for boredom is curiosity. This is the log of its adventures. 778

Python中变量和引用及标识符命名规则

Python中的变量和引用

weixin_38418936的博客 796

可共享的 Python 类属性

总结起来,Python 的类属性是可以被所有实例共享的。它们对于存储类的共有数据非常有用,例如所有实例都具有相同的默认值或者需要共享的配置信息。然而,需要注意的是,当实例修改了类属性的值时,只有该实例会受到影响,其他实例不会改变。类属性是属于类本身的属性,可以被该类的所有实例共享。定义可共享的类属性非常简单,只需在类的内部定义一个变量,并将其放在所有方法之外。需要注意的是,如果我们直接通过类来修改类属性的值,所有实例都会受到影响。的类,并在类的内部定义了一个名为。的值,然后再创建新的实例,它们的。

Meta_C的博客 263

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

第7.12节 可共享的Python类变量一、 引言在上节已经引入介绍了类变量和实例变量,类体中定义的变量为类变量,默认属于类本身,实例变量是实例方法中定义的self对象的变量,对于每个实例都是独有数据,而类变量是该类所有实例共享的属性和方法。二、 类变量的定义方式类变量的定义其实就是对变量赋值,有如下方式可以进行类变量的定义:1. 在类体代码中,直接用变量名赋值。类体代码是在类定...

weixin_39614521的博客 151

硬件笔记——HDMI接口

HDMI可以同时传输视频信号、音频信号和控制信号。其中高速信号有四组:从Data TX到Data RX有3组差分数据信号(TMDS_DATA0~2)和一组差分时钟信号(TMDS_CLOCK)。以及若干低速线。脚编号信号名称信号类型功能说明1热插拔检测连接状态检测。接收端通过此引脚向源端发送高电平信号,通知其已连接并可以开始读取EDID。2UTILITY车载用途悬空3TMDS数据通道2差分信号正极,用于传输视频像素、音频和数据包。4TMDS数据2屏蔽。

2501_94625908的博客 537

python中属性和类级变量_六、Python类变量和实例变量(类属性和实例属性)

我们知道,无论是在类中定义的属性还是方法,在类的外部,都无法直接调用它们,因此,我们完全可以把类看做是一个独立的作用域(称为类命名空间),则类属性其实就是定义在类命名空间内的变量(类方法其实就是定义的类命名空间中的函数)。根据定义属性的位置不同,类属性又可细分为类属性(后续用类变量表示)和实例属性(后续用实例变量表示)。类变量(类属性)类变量指的是定义在类中,但在各个类方法外的变量。类变量的特点是...

weixin_42499800的博客 518

项目方案:社会视频资源整合接入汇聚系统解决方案(五)

视频监控接入和视频汇聚平台,形成整合平台,平台服务层包括编码设备、存储设备、解码设备等的接入服务,提供基础视频服务、传输服务、存储服务、控制服务及事件服务。两种不同的接入方式:监控设备接入,是指接入社会单位视频监控系统的DVR(数字硬盘录像机)、DVS和IPC、DVR/NVR、CVR等设备;平台对接,是指对接接入社会单位数字视频监控平台。AS-VAG视频监控接入网关支持onvif、国标等接入,也支持多种SDK接入方式,包括国产的主流品牌支持海康、大华、宇视、华为等SDK,国际品牌支持松下和axis等SDK。

weixin_70208651的博客 2464

从零到一:手把手教你构建自定义ReaxFF力场参数

本文手把手教你从零构建自定义ReaxFF力场参数,详解反应力场的动态键序机制与参数化逻辑。通过LAMMPS实战演示,涵盖训练数据准备、参数优化算法选择及性能优化技巧,助力研究人员精准模拟化学反应过程。适用于材料科学、催化研究等领域,特别适合已掌握分子动力学基础的进阶用户提升力场开发能力。

weixin_28365523的博客 1056

第7章 Python类型、类、协议目录

第7.1节 面向对象程序设计的相关知识 第7.2节 关于面向对象设计的一些思考 第7.3节 Python特色的面向对象设计:协议、多态及鸭子类型 第7.4节 Python中与众不同的类 第7.5节 揭开Python类中self的面纱 第7.6节 Python中类的继承机制详述 第7.7节 案例详解:Python类继承机制 第7.8节 Python中隐秘的类封装方法 第7.9节...

老猿Python 1830

Ubuntu22.04安装搜狗输入法踩坑实录:从依赖报错到完美解决的完整指南

本文详细解析了在Ubuntu 22.04系统上安装搜狗拼音输入法的完整流程,从解决依赖报错到配置fcitx框架,再到最终优化使用体验。针对常见的dpkg安装错误和fcitx冲突问题,提供了实用的解决方案和命令,帮助用户顺利完成安装并享受流畅的中文输入体验。

palm99的专栏 971

【问题整理】python在多进程间同步变量时遇到的问题

多进程编程是提升计算效率的一种重要方法,关于其介绍可以参见参考内容1。python3提供了multiprocessing标准库来支持跨平台的多进程编程,非常方便。最近在利用该标准库进行编程,发现在进程间实现变量共享(通信)时,有一些细节问题跟常规理解不太一致,如果不清楚,会在使用时带来不小的麻烦。 1.问题提出 假设有一个长度为L,每个位置的初始值为0的向量;再给定一个函数f,该函数的作用是将任意...

芳樽里的歌的博客 1548

W5500 TCP服务器状态机详解:从SOCK_CLOSED到SOCK_ESTABLISHED的完整流程

本文深入解析W5500芯片作为TCP服务器时的状态机转换流程,从SOCK_CLOSED到SOCK_ESTABLISHED的完整链路实践。通过硬件协议栈架构分析、状态机全流程拆解及异常处理方案,帮助开发者构建高可靠性的嵌入式网络服务端,优化TCP连接性能与稳定性。

Jerry的专栏 1165

背靠背VSC直流母线电压控制与同步发电机并网发散问题:原理、分析与解决方案

背靠背VSC直流母线电压控制与同步发电机并网发散问题分析 摘要: 本文研究了背靠背VSC系统在整流侧由理想三相电源切换为同步发电机时出现的直流母线电压振荡和发散问题。通过理论分析发现,锁相环同步失稳、等效阻抗失配和直流母线电容参数失配是导致系统失稳的关键因素。当整流侧接入同步发电机后,系统形成正反馈振荡回路,同时等效电感增大导致电流环响应速度降低,直流侧电容容量不足无法吸收发电机功率波动。文章提出了从跟网型控制到构网型VSG控制的完整升级方案,包含详细的MATLAB/Simulink建模和控制算法实现,并通

huanghm88的专栏 121

从入门到精通:Python 3.12模式匹配变量捕获完全指南

掌握Python 3.12模式匹配的变量捕获技巧,轻松提升代码可读性与效率。详解其在数据解析、条件分发等场景的应用,结合match-case语法展示变量绑定与模式提取的核心方法,显著简化复杂逻辑处理。实用指南值得收藏。

InstrFun的博客 953

多天线技术:5G波束成形&空间复用&空时编码

以提升信号的可靠性。然而,在20世纪90年代中期,研究者们惊讶地发现,多天线技术不仅仅提供分集增益,还可以开启一些单天线系统无法实现的新机遇。,我们可以将信道矩阵 ( H ) 视为一个满秩矩阵,则理论上可以建立min(𝑁𝑇,𝑁𝑅)个独立的数据流,形成一个。波束成形是5G物理层的核心技术,其本质是利用多个天线来增强特定方向上的信号,同时抑制干扰方向的信号。:物理波束成形 = 🔦 类似手电筒的聚焦光束,虚拟波束成形 = 🌊 类似水波的相干叠加。随着 5G 和 6G 时代的到来,多天线技术的作用愈发重

weixin_43199439的博客 1389

为什么你的模式匹配总出错?Python 3.12变量捕获机制深度剖析

掌握Python 3.12模式匹配的变量捕获技巧,解决匹配失败与变量覆盖问题。详解语法结构、适用场景及常见陷阱,助你精准捕获目标值,提升代码可读性与效率。深度剖析核心机制,值得收藏。

BreakNexus的博客 617

实测可复现|2026 Cloudflare盾v4.0反反爬全实战:从JS/WASM逆向到JA3指纹伪装,手把手突破拦截(附完整逆向代码+避坑手册)

本文以2026年Cloudflare盾v4.0(集成Shield Synapse v2.0)为核心,全程以实战复盘为视角,拆解了从JS/WASM混合逆向、全维度指纹伪装(JA3+浏览器指纹)、人类行为模拟,到代理池搭建的全流程,整合了完整可复现的代码,所有步骤和踩坑点均为实测所得,无任何AI套话,新手也能跟着复现,最终实现爬取成功率从12%提升至95%+。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1686

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

python模块是一个可共享的程序_python基础-模块

一 模块介绍#一个python文件有两种用途#1、被当成程序运行#2、被当做模块导入在Python中,一个py文件就是一个模块,文件名为xxx.py模块名则是xxx,导入模块可以引用模块中已经写好的功能。如果把开发程序比喻成制造一台电脑,编写模块就像是在制造电脑的零部件,准备好零部件后,剩下的工作就是按照逻辑把它们组装到一起。将程序模块化会使得程序的组织结构清晰,维护起来更加方便。比起直接开发一个...

weixin_39889544的博客 344

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

python多进程之间共享变量

python多进程之间不能直接共享全局变量。

Major_S的博客 4177

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

python模块是一个可共享的程序_python面试题

1、到底什么是Python?你能够在回答中与其余技术进行对比(了解).答案python下面是一些关键点:程序员Python是一种解释型语言。这就是说,与C语言和C的衍生语言不一样,Python代码在运行以前不须要编译。其余解释型语言还包括PHP和Ruby。算法Python是动态类型语言,指的是你在声明变量时,不须要说明变量的类型。你能够直接编写相似x=111和x="I'm a string"这样的...

weixin_32721919的博客 272

第8.30节 重写Python __setattr__方法实现属性修改捕获

一、 引言 在《第8.26节 重写Python类中的__getattribute__方法实现实例属性访问捕获》章节介绍了__getattribute__方法,可以通过重写该方法,截获所有通过“实例名.属性名”访问实例变量、类变量、实例方法的所有操作,这是一个非常符合Python风格的方法。类似的,Python提供了__setattr__方法截获所有给属性赋值的能操作,在本节的前2节介绍了调用__s...

老猿Python 3576

Python 中的类和对象

类(class) 对比函数:函数名以小写字母开头,类名以大写字母开头。 类中定义属性和方法(def)。 __init__用于初始化,self指向对象。 >>> class StuNum: age = 20 # 属性 __sex = "Female" # 私有变量,不可用sn...

weixin_44607150的博客 164
上一篇: 第7.11节 案例详解:Python类实例变量
下一篇: 第7.13节 案例详解:Python类变量
LaoYuanPython
LaoYuanPython 2020年博客之星Top3 2020年博客之星Top3 领域专家: Python技术领域 领域专家: Python技术领域
博客等级 码龄8年 15万+粉丝 1324原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值