第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类变量的更多相关文章

  1. 第7.20节 案例详解:Python抽象类之真实子类

    第7.20节 案例详解:Python抽象类之真实子类 上节介绍了Python抽象基类相关概念,并介绍了抽象基类实现真实子类的步骤和语法,本节结合一个案例进一步详细介绍. 一.    案例说明 本节定义 ...

  2. 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法

    第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一.    案例说明 本节定义了类Sta ...

  3. 第7.16节 案例详解:Python中classmethod定义的类方法

    第7.16节  案例详解:Python中classmethod定义的类方法 上节介绍了类方法定义的语法以及各种使用的场景,本节结合上节的知识具体举例说明相关内容. 一.    案例说明 本节定义的一个 ...

  4. 第7.9节 案例详解:Python类封装

    上节介绍了Python中类的封装机制,本节结合一个具体例子进行详细说明. 我们定义一个Person类,其内部有姓名.年龄和类型三个实例变量,并定义了相关的存取方法: class Person():   ...

  5. 第7.11节 案例详解:Python类实例变量

    上节老猿介绍了实例变量的访问方法,本节结合一个具体案例详细介绍实例变量访问. 本节定义一个Vehicle类(车),它有三个实例变量self.wheelcount(轮子数).self.power(动力) ...

  6. 第7.7节 案例详解:Python类继承机制

    本节实现一个类继承的小程序,下面一边结合代码一边介绍相关继承的知识.例子以车.汽车为例,车为父类.汽车为子类. 一.    定义父类Vehicle class Vehicle():    def __ ...

  7. 第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter

    上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一.    案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...

  8. 第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样?

    第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样? 一.    案例说明 我们上节提到了,使用property函数定义的属性不要与类内已经定义的普通实例变量重 ...

  9. 第7.24节 Python案例详解:使用property函数定义属性简化属性访问代码实现

    第7.24节 Python案例详解:使用property函数定义属性简化属性访问代码实现 一.    案例说明 本节将通过一个案例介绍怎么使用property定义快捷的属性访问.案例中使用Rectan ...

随机推荐

  1. 【Kata Daily 190929】Password Hashes(密码哈希)

    题目: When you sign up for an account somewhere, some websites do not actually store your password in ...

  2. C# 9.0 正式发布了(C# 9.0 on the record)

    翻译自 Mads Torgersen 2020年11月10日的博文<C# 9.0 on the record> [1],Mads Torgersen 是微软 C# 语言的首席设计师,也是微 ...

  3. 解决js中对象中属性是数组中对应元素,不能使用点数组元素(.数组[i])来获取value值来循环,属性不能是数组元素array[i]的问题

    数据类型 //示例 var tags1avg= ['rg2_crt_001_001_avg', 'rg2_crt_001_002_avg', 'rg2_crt_001_003_avg', 'rg2_c ...

  4. Chrome默认启动尺寸的小问题

    记录一个小问题. 这是我的Chrome,他默认启动的时候是这样的: 默认启动的尺寸似乎不可调,网上没有相关资料,简直让强迫症患者无所适从,这里记录一下偶然发现的方法: 调整Chrome的尺寸,选择右上 ...

  5. 美团面试官问我: ZGC 的 Z 是什么意思

    本文的阅读有一定的门槛,请先了解 GC 的基本只知识. 现代垃圾收集器的演进大部分都是往减少停顿方向发展. 像 CMS 就是分离出一些阶段使得应用线程可以和垃圾回收线程并发,当然还有利用回收线程的并行 ...

  6. linux笔记【简版】

    1.linux简介 kernel 内核 shell 外壳 (类似win上的cmd) sh,Bash:#root,$user csh:#root,%user filesystem 文件管理系统 2.优势 ...

  7. 这 12 款 IDEA 插件你用过几款?

    搞 Java开发用什么软件,当然是神器idea了,那么,idea的插件对于你来说就是必不可少的了,不仅可以提高自己的编码效率,还可以减轻工作时的枯燥烦闷.接下来就来说说,我平时敲代码用的什么插件吧. ...

  8. Vue.js自定义标签属性并获取属性,及绑定img的src属性的坑

    一.定义属性: 一般定义属性都是为了动态的去获取属性的值,或者动态的设置属性的值,如果想仅仅是设置一个普通的属性,直接在便签上设置属性即可,就像使用html的title.name等属性一样,如< ...

  9. Windows常用的网络命令

    命令 说明 ipconfig 查看网络配置的信息 ping 测试网络是否连通 tracert 网络诊断工具,可以列出分组经过的路由节点 net 有添加用户.开启服务等功能 netstat 显示协议统计 ...

  10. Java web项目JXl导出excel,(从eclipse上移动到tomact服务器上,之路径更改)

    我用的是jxl导出excel,比较简单,最开始我是固定路径不能选择,很局限,后来改了,而且固定路径当把项目放在服务器上时,路径不可行. 在网上各位大神的帮助成功设置响应头,并且可选保存路径. 1.前端 ...