第7.13节 案例详解:Python类变量
第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.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!
第7.13节 案例详解:Python类变量的更多相关文章
- 第7.20节 案例详解:Python抽象类之真实子类
第7.20节 案例详解:Python抽象类之真实子类 上节介绍了Python抽象基类相关概念,并介绍了抽象基类实现真实子类的步骤和语法,本节结合一个案例进一步详细介绍. 一. 案例说明 本节定义 ...
- 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法
第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一. 案例说明 本节定义了类Sta ...
- 第7.16节 案例详解:Python中classmethod定义的类方法
第7.16节 案例详解:Python中classmethod定义的类方法 上节介绍了类方法定义的语法以及各种使用的场景,本节结合上节的知识具体举例说明相关内容. 一. 案例说明 本节定义的一个 ...
- 第7.9节 案例详解:Python类封装
上节介绍了Python中类的封装机制,本节结合一个具体例子进行详细说明. 我们定义一个Person类,其内部有姓名.年龄和类型三个实例变量,并定义了相关的存取方法: class Person(): ...
- 第7.11节 案例详解:Python类实例变量
上节老猿介绍了实例变量的访问方法,本节结合一个具体案例详细介绍实例变量访问. 本节定义一个Vehicle类(车),它有三个实例变量self.wheelcount(轮子数).self.power(动力) ...
- 第7.7节 案例详解:Python类继承机制
本节实现一个类继承的小程序,下面一边结合代码一边介绍相关继承的知识.例子以车.汽车为例,车为父类.汽车为子类. 一. 定义父类Vehicle class Vehicle(): def __ ...
- 第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter
上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一. 案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...
- 第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样?
第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样? 一. 案例说明 我们上节提到了,使用property函数定义的属性不要与类内已经定义的普通实例变量重 ...
- 第7.24节 Python案例详解:使用property函数定义属性简化属性访问代码实现
第7.24节 Python案例详解:使用property函数定义属性简化属性访问代码实现 一. 案例说明 本节将通过一个案例介绍怎么使用property定义快捷的属性访问.案例中使用Rectan ...
随机推荐
- leetcode 38:path-sum
题目描述 给定一个二叉树和一个值sum,判断是否有从根节点到叶子节点的节点值之和等于sum的路径, 例如: 给出如下的二叉树,sum=22, 5 / ...
- 把数据转化为JSON格式用ajax进行前后端交互
接着在https://www.cnblogs.com/dong973711/p/10907733.html的基础上做验证. 从前端提交数据 前端页面,submit.html <!DOCTYPE ...
- ElementUI表格行编辑单元格编辑支持(输入框,选择框)Demo
嗯,需要做成这个样子,所以网上查了些资料.整理了下.提供几个一个思路.不足之处请小伙伴指出来. 普通版的table可编辑内嵌select选择框,输出框,编辑删除添加等 <!DOCTYPE ht ...
- WEB安全问题
WEB安全问题我没太多经验,但是这块内容还是很重要,所以必须要了解学习一下. 简单总结了一下,分成以下5类, 1.DDOS,瘫痪式攻击,解决方法是记录异常请求的ip地址,主动拒绝或者将攻击ip添加到防 ...
- TCP粘包问题的解决方案02——利用readline函数解决粘包问题
主要内容: 1.read,write 与 recv,send函数. recv函数只能用于套接口IO ssize_t recv(int sockfd,void * buff,size_t len,i ...
- 适用初学者的5种Python数据输入技术
摘要:数据是数据科学家的基础,因此了解许多加载数据进行分析的方法至关重要.在这里,我们将介绍五种Python数据输入技术,并提供代码示例供您参考. 数据是数据科学家的基础,因此了解许多加载数据进行分析 ...
- Spring源码之Bean生命周期
https://www.jianshu.com/p/1dec08d290c1 https://www.cnblogs.com/zrtqsk/p/3735273.html 总结 将class文件加载成B ...
- WIN10下安装python3.7.2出现“尝试创建C:\Users\XX\AppData\Roaming\Microsoft\Installer时出错”
WIN10下安装python3.7.2出现"尝试创建C:\Users\XX\AppData\Roaming\Microsoft\Installer时出错" 1.右键点击安装包以管理 ...
- 如何统计Ceph的RBD真实使用容量
前言 ceph的rbd一直有个问题就是无法清楚的知道这个分配的空间里面到底使用了多少,这个在Jewel里面提供了一个新的接口去查询,对于老版本来说可能同样有这个需求,本篇将详细介绍如何解决这个问题 查 ...
- Spring @Autowired 注解自动注入流程是怎么样?
面试中碰到面试官问:"Spring 注解是如果工作的?",当前我一惊,完了这不触及到我的知识误区了吗?,还好我机智,灵机一动回了句:Spring 注解的工作流程倒还没有看到,但是我 ...