第7.13节 案例详解:Python类变量

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

第7.13节 案例详解:Python类变量

上节介绍了类变量的定义和使用方法,并举例进行了说明。本节将通过一个更完整的例子来说明。
一、    定义函数dirp

def dirp(iter): return [i for i in dir(iter) if not i.startswith('__')]

该函数的作用是去掉对象属性中以双下划线开头的变量,双下划线开头的变量要么是私有变量、要么是特殊变量(双下划线结尾时),实际上私有变量Python进行了转换,真正存储时不是双下划线开头,因此该函数实际上就是去掉对象的那些特殊变量,这些特殊变量大部分都是继承object类的(因为Python3中,所有自定义类都是object类的子类,请见前面章节的内容)。
通过该函数能够方便看到对象中自定义的属性和方法。
二、    类定义

class VarTest():
  classvar='classvar'
  objectcount=0
  samenamevar='samenamevar in class'
  def __init__(self):
     self.objvar='objvar'
     self.samenamevar='samenamevar in obj'
     samenamevar='samenamevar in __init__'
     VarTest.objectcount += 1
     
  def output(self):
      print("通过self访问类变量classvar的值:",self.classvar)
      print("通过self访问实例变量objvar的值:",self.objvar)
      print("通过self访问类变量和实例变量都定义了的samenamevar的值:",self.samenamevar)
print("通过类名访问类变量classvar的值:",VarTest.classvar)
      print("通过类名访问类变量和实例变量都定义了的samenamevar的值:",VarTest.samenamevar)
      print("类变量objectcount的值:",VarTest.objectcount) 
      if hasattr(VarTest,'varcnt'):print("类变量varcnt的值:",VarTest.varcnt) 
          else:print("类中没有定义变量varcnt")
try:print("实例方法直接访问classvar的值:",classvar)
      except:print("实例方法直接访问classvar的值失败")

上述代码:
1、    在类体代码中定义了类变量classvar(初始值为字符串'classvar')、objectcount(初始值为0,准备用来记录类生成的实例数量)、samenamevar(初始值为字符串'samenamevar in class',并且在实例中将定义同名变量);
2、    在构造方法中,定义了实例变量objvar(初始值为'objvar')、同名实例变量samenamevar(初始值为samenamevar in __init__),同时对类变量VarTest.objectcount计数加一;
3、    定义了一个输出实例方法output,输出:
1)    通过self输出self.classvar、self.objvar、self.samenamevar的值,注意此时除了self.classvar是类变量的值,self.samenamevar是实例变量的值(当类和实例都有同名变量时,通过self访问的是实例变量的值);
2)    通过类名访问classvar、samenamevar、objectcount、varcnt的值,其中varcnt在类中没有定义,准备是在调用方通过类名赋值方式访问,为了确保相关代码不报错,加了一个判断类是否有varcnt属性的判断;
3)    最后直接访问classvar,此时没通过类名称和self,应该报错,因此加了异常处理。

三、    调用代码
下面是老猿写的调用代码,我们逐一来看:

var1=VarTest()#定义实例var1
dirp(var1)#显示实例的属性['classvar', 'objectcount', 'objvar', 'output', 'samenamevar']
var1.output()
VarTest.varcnt=0
dirp(var1)

到目前为止相关代码的截图:
 
上面标记部分说明如下:
1、    直接访问classvar是失败的,这个classvar应该是一个局部变量;
2、    对于类和实例都有的变量samenamevar,通过self.samenamevar是访问的实例变量的值,通过类名访问是类变量的值;
3、    当执行VarTest.varcnt=0后,类就有了属性varcnt,即类变量varcnt。不过这种方式不推荐使用,所有类变量应该在类体中定义;

我们继续在命令行逐行执行后续代码:

var2=VarTest()
dirp(var2)
var1.output()
var2.output()
var2. varcnt, var1.varcnt
var2.varcnt=2
var2. varcnt, var1.varcnt

执行截屏如下:


 
上面标记部分说明如下:
1、    类变量objectcount在var2定义后变成了2,如果通过var1.objectcount,var2.objectcount发现都是2;
2、    执行var2.varcnt=2后,实际是定义了var2的实例变量varcnt并赋值为2,而类变量的值保持0不变,这点需要各位重点注意。

本节通过例子详细介绍了类变量的定义和访问方法,从上述例子可以得出:
1、    类变量和实例变量同名时,通过实例访问时只能访问实例变量;
2、    “实例.类变量”方式的赋值语句实际上不是给类变量赋值,而是定义新的实例变量,因此尤其需要引起重视,这也是为什么老猿推荐使用类名方式访问类变量的原因。

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

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

相关推荐

Go语言--接口(interface)

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

yunfan 1572

第7.12节 可共享的Python类变量

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

老猿Python 3307

第13课 10个案例,学习python类的继承

通过这 10 个案例,你可以从多个角度深入学习和理解 Python 类继承的相关概念、语法以及应用场景,更好地运用继承机制来构建面向对象的程序。

weixin_45326892的博客 1056

[Python]成员变量与类变量

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

HYJZ的博客 2079

小牛叔讲Python第13章:类Class中的各种变量类型

本文对于Python类中的私有变量、类属性、实例属性进行了详细的讲解,这是面向对象的重要概念。

小牛叔 1930

Python 2.7.13 Windows安装体验包

在安装Python时添加到PATH变量的路径,可以通过系统属性进行进一步编辑。例如,添加额外的库目录到Scripts文件夹,以便更方便地使用pip安装的工具。有多种自动化迁移工具可以帮助开发者转换代码,比如2to3和Modernize。这些工具可以帮助自动化转换代码的过程,但对于复杂的代码库,仍需人工干预。

weixin_33375360的博客 1008

python类变量执行几次_第7.13节 案例详解:Python类变量

第7.13节 案例详解:Python类变量上节介绍了类变量的定义和使用方法,并举例进行了说明。本节将通过一个更完整的例子来说明。一、 定义函数dirpdef dirp(iter): return [i for i in dir(iter) if not i.startswith('__')]该函数的作用是去掉对象属性中以双下划线开头的变量,双下划线开头的变量要么是私有变量、要么是特殊变量(双...

weixin_33929779的博客 262

10X Genomics数据实战:手把手教你用Seurat处理单细胞PBMC数据(附完整代码)

本文详细介绍了如何使用Seurat处理10X Genomics的单细胞PBMC数据,从数据获取、质控到降维分析和细胞分群的全流程。通过实战代码演示,帮助研究者掌握单细胞RNA测序数据分析的核心技术,提升对细胞异质性的理解。

weixin_29053577的博客 252

Python的类变量、实例变量

参考: Python类变量和实例变量(类属性和实例属性)在类体中,根据变量定义的位置不同,以及定义的方式不同,类属性又可细分为以下 3 种类型:类变量指的是在类中,但在各个类方法外定义的变量。举个例子: 上面程序中,name 和 add 就属于类变量。类变量的特点是,所有类的实例化对象都同时共享类变量,也就是说,类变量在所有实例化对象中是作为公用资源存在的。类方法的调用方式有 2 种,既可以使用类名直接调用,也可以使用类的实例化对象调用。比如,在 CLanguage 类的外部,添加如下代码: 程序运行结果为

sally的jerry 2276

香橙派OPi 6系列选型指南:RK3588与RK3588S开发板深度对比

开发板选型是嵌入式系统设计的关键环节,尤其在边缘计算和AI推理等场景中,芯片的差异直接影响硬件架构。瑞芯微RK3588及其精简版RK3588S是当前高端开发板的核心方案,两者在PCIe通道、显示输出和SATA支持上存在显著区别。理解这些原理,有助于工程师根据项目需求快速匹配产品。香橙派OPi 6系列基于这两款芯片,衍生出OPi 6、OPi 6 Pro与OPi 6 Max三种形态:紧凑型适合嵌入式门禁与AI盒子,Pro版凭借双屏异显和PCIe 3.0满足收银机与视频分析,Max的双2.5G网口和大内存则面向轻

weixin_29185167的博客 224

51单片机自学笔记(六)数码管动态扫描与消影实战

本文详细解析了51单片机数码管动态扫描原理与视觉暂留效应,通过硬件电路分析和C语言代码实战,重点介绍了三种数码管消影技术(段选清零法、位选屏蔽法、硬件消影法),解决了显示重影问题,并提供了常见问题调试技巧与定时器中断优化方案,帮助开发者掌握稳定的多位数码管显示技术。

y9z0a1b的博客 1103

Python类变量和实例变量区别

深入理解python类的实例变量和类变量 Python变量的本质:被赋值 1 普通python变量(非类相关变量)很容易理解,在被赋值后即变量存在,可读可写 2 Python类的变量(类变量和实例对象变量)以某种方式在某地方被赋值,即存在,可被读写 2.1 Python类变量被赋值      (1)类的设计里,              class里def外,通过变量名能被赋值

1万+

Outlook邮件规则实战:从自动化分类到GTD工作流整合

在信息过载的数字化办公环境中,自动化处理技术成为提升效率的关键。其核心原理是基于“条件-动作”的触发器模型,通过预设逻辑让系统自动执行重复性任务。这种自动化机制的技术价值在于将用户从繁琐的机械操作中解放出来,实现信息流的智能管控。在邮件管理这一典型应用场景中,自动化规则能精准处理项目邮件聚合、优先级分流等复杂需求。本文聚焦于微软Outlook的规则引擎,深入解析如何利用**规则引擎**和**触发器模型**构建高效的邮件处理系统,并进一步将其融入GTD(Getting Things Done)个人生产力框架,

weixin_31083901的博客 312

【Python基础】第13节:类的继承、重写和多继承

继承是指一个类(子类)可以继承另一个类(父类)的属性和方法。子类可以直接使用父类的属性和方法,也可以扩展或修改父类的行为。就像人类有共同的祖先一样。:创建三个类(A/B/C),C继承A和B,并调用所有方法。方法可以修改对象的属性(如cook方法修改level):子类自动获取父类的属性和方法,无需重复编写相同代码。就像孩子继承父母的特征(如眼睛像妈妈,嘴巴像爸爸)调用继承链中第一个父类(Yidiandian)的。# 输出:���� 按照《自研奶茶配方》制作奶茶。3.多继承综合案例(奶茶师傅的配方之争)

m0_62283350的博客 838

WSL2网络配置全攻略:如何让Windows和Linux子系统互相访问端口(附防火墙设置)

本文深入解析WSL2的网络架构,并提供详细的端口互通配置指南。针对WSL2与Windows宿主机之间常见的网络访问问题,文章从原理出发,逐步讲解如何识别网络环境、配置Windows防火墙规则、调整服务监听地址,并介绍镜像网络模式等进阶优化方案,最终实现稳定可靠的双向端口访问。

sony5的博客 1148

C#实战:5分钟搞定Modbus RTU通讯(基于NModbus4库)

本文详细介绍了如何使用C#和NModbus4库快速实现Modbus RTU通讯,包括环境配置、核心功能实现、性能优化及常见问题排查。通过代码示例和实用技巧,帮助开发者高效完成工业自动化设备的数据采集与控制任务。

weixin_30689307的博客 467

Centos7安装Python3.13

Centos7.5环境上安装Python3.13

sunny05296的博客 1808

Ubuntu18.04黑屏救急指南:从tty到图形界面的5种恢复方法(附网络配置技巧)

本文针对Ubuntu 18.04系统启动后出现黑屏并进入tty命令行的问题,提供了一套从紧急诊断到完全恢复图形化界面的系统性实战指南。文章详细讲解了五种核心恢复方法,包括重启显示管理器、重装ubuntu-desktop桌面环境、手动安装Xorg与LightDM等,并重点解决了纯命令行环境下的网络配置难题,帮助用户快速修复系统,恢复工作环境。

weixin_29243279的博客 359

Python中的类变量和成员变量

本文实例形式讲解了python的类变量和成员变量用法,对于Python程序设计有一定的参考价值。分享给大家供大家参考。具体如下: 先看看下面这段代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class TestClass(object):   va

gzhouc的专栏 5万+

交换机初始化配置详解

MGMT或称MGT(Management Port,管理端口)是一个可以连接计算机的三层主机端口,如下图所示。只需使用一条双绞线跳线,就可以将计算机的以太网端口与交换机的MGMT端口连接在一起,实现对交换机的配置与管理。也就是说,可以使用MGMT端口代替Console端口实现对交换机或交换机堆叠的网络管理。MGMT端口既可用于交换机的初始化,也可以在交换机初始化完成后,以Telnet、Web浏览器或Cisco CNA方式进行管理。当将计算机连接到独立的交换机时,连接方式如下图所示。

悦分享 1993

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

第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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Win10+Python2.7.13的安装和环境变量的配置以及初次在notepad++下编写Python程序

1、Python的安装 打开浏览器访问http://www.python.org/download/ 在下载列表中选择Window平台安装包,包格式为:python-XYZ.msi 文件 , XYZ 为你要安装的版本号。选择Window平台后进入该页面,然后找到自己对应的版本号。 我选择的是Python2.7.13的Window x86-64 MSI instal

KaaiLee的博客 4689

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Python类中的私有变量和公有变量

我们这里就直奔主题,不做基础铺垫,默认你有一些Python类的基础,大家在看这篇博客的时候,如果基础知识忘了,可以去菜鸟教程 从一个简单的类开始 class A(): #定义一个类 A a = 100 #公有变量 _b = 200 #公有变量 __c = 300 #私有变量 __d__ = 400 #公有变量 a = A() #实例化一个对象a print(a.a,a._b,a.__c,a.__d__) #打印四个变量的值 运

下家山的博客 6024

python13:类

Python是面向对象的语言,Python中的类提供了面向对象的所有特征:多态、封装和继承。     1)多态:可以对不同的对象使用同样的操作,它会根据对象(或类)类型的不同而表现出不同的行为;     2)封装:对外部世界隐藏对象的工作细节;     3)继承:以普通的类为基础建立特定的类对象。 更多面向对象的概念请参考专门的面向对象的书籍,下面将介绍Python中类的定义和使用方法。

宁静致远 1559

CentOS7升级Python2.7.5至2.7.13版本

CentOS7系统目前默认python环境版本号为2.7.5,在实际的开发、测试环境中我们可能需要2.7.13的版本,但是Centos操作系统自带软件可能依赖python2.7.5版本,故原版本不能删除,我们只能python基础版本与高版本并存,以下为具体步骤: 1、查看Centos版本及python版本: [root@localhost ~]# cat /etc/centos-rele...

Leroi_Liu的博客 1453
上一篇: 第7.12节 可共享的Python类变量
下一篇: 第7.14节 Python类中的实例方法详析
LaoYuanPython
LaoYuanPython 2020年博客之星Top3 2020年博客之星Top3 领域专家: Python技术领域 领域专家: Python技术领域
博客等级 码龄8年 15万+粉丝 1324原创
评论 10
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值