简单分析python的类变量、实例变量


Posted in Python onAugust 23, 2019

1、类变量、实例变量概念

类变量:

类变量就是定义在类中,但是在函数体之外的变量。通常不使用self.变量名赋值的变量。类变量通常不作为类的实例变量的,类变量对于所有实例化的对象中是公用的。

实例变量:

实例变量是定义在方法中的变量,使用self绑定到实例上的变量,只是对当前实例起作用。

2、访问

类变量

在类的内部和外部类变量都可以直接使用className.类变量的形式访问。但是在类的内部,也可以使用self.类变量来访问,但是这个是用含义就不同了(后面使用代码验证)。

实例变量

在类的内部,实例变量self.实例变量的形式访问;在类的外部使用对象名。实例变量的形式访问。实例变量是绑定到一个实例上的变量,它只是属于这个绑定的实力。而区别类变量的就是类变量是所有的来自用一个类的实例所共享。我们看到这里会有这样的疑问!

如果说类变量对所有来自这个类的所有实例所共享,那么假如我一个实例去改变了这个类变量(假设使用这样的操作object.类变量 = value)的值,那么对于其他的实例是不是都是可见的?

答案是否定的,下面验证。

class A(object):
  # 定义一个类变量,初值是10
  class_var = 10
  print id(class_var)
  def foo(self):
  print '在类中访问类变量:A.class_var=', A.class_var
  print '在类中访问实例变量: self.class_var=', self, self.class_var
 
  # 改变实例变量的值
  self.class_var = 40
  print '修改后访问类变量:A.class_var=', A.class_var
  print '修改后访问实例变量 self.class_var=',self, self.class_var
 
  # 这里的class_var和函数外面的class_var不是同一个东西,这是一个局部变量
  class_var = 20
  print id(class_var)
  print 'class_var=', class_var
 
     
  A.class_var = 15
  print 'A.class_var=', A.class_var
  print 'class_var=',class_var
  print 'self.class_var=',self.class_var
     
 
obj1 = A()
obj2 = A()
obj3 = A()
obj1.foo()
print A.class_var
print obj1.class_var
print obj2.class_var
print obj3.class_var

Output:

49964144
在类中访问类变量:A.class_var= 10
在类中访问实例变量: self.class_var= <__main__.A object at 0x0000000002FD2390> 10
修改后访问类变量:A.class_var= 10
修改后访问实例变量 self.class_var= <__main__.A object at 0x0000000002FD2390> 40
49963904
class_var= 20
A.class_var= 15
class_var= 20
self.class_var= 40
15
40
15
15

从上面运行的结果分析:当使用self.class_var形式访问类变量的之后,如果修改self.class_var的值,可以发现,类变量的值没有变化;不放心我们在修改类变量的值,发现self.class_var的值也没有受到影响。

从最后打印obj2和obj3这两个都来自于一个类的实例中的类变量都是和修改后的类变量一样,表示他们是共享类变量的。

3、总结

1、类变量可以使用className.类变量和self.类变量两种方式访问。
2、如果使用self.类变量的方式访问并重新赋值后,这个变量就会成为实例变量和self绑定,实际上就变成了一个实例变量,实例变量会屏蔽掉类变量的值。
3、类变量是共享的,最好使用类名的方式来访问类变量。
4、类变量通过sel访问时,就会被转化成实力变量,被绑定到特定的实例上。
5、实例变量(self)的形式对类变量重新赋值后,类变量的值不会随之变化。
6、实例变量对每一个对象是不可见的,每一个对象拥有着可能不同的值。

以上我们整理的知识点希望能够帮助到大家,感谢大家对三水点靠木的支持。

Python 相关文章推荐
Python ORM框架SQLAlchemy学习笔记之关系映射实例
Jun 10 Python
Python中文件操作简明介绍
Apr 13 Python
Python中使用urllib2模块编写爬虫的简单上手示例
Jan 20 Python
Python中shape计算矩阵的方法示例
Apr 21 Python
浅析python打包工具distutils、setuptools
Apr 20 Python
pycharm 实现显示project 选项卡的方法
Jan 17 Python
python实现矩阵打印
Mar 02 Python
pyqt5移动鼠标显示坐标的方法
Jun 21 Python
将matplotlib绘图嵌入pyqt的方法示例
Jan 08 Python
Python基础之字符串操作常用函数集合
Feb 09 Python
Python实现双向链表基本操作
May 25 Python
Python实现聚类K-means算法详解
Jul 15 Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 #Python
python-Web-flask-视图内容和模板知识点西宁街
Aug 23 #Python
python3 selenium自动化测试 强大的CSS定位方法
Aug 23 #Python
python3 selenium自动化 下拉框定位的例子
Aug 23 #Python
python Web flask 视图内容和模板实现代码
Aug 23 #Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
Aug 23 #Python
Python 实用技巧之利用Shell通配符做字符串匹配
Aug 23 #Python
You might like
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
2014/08/25 PHP
php判断一个数组是否为有序的方法
2015/03/27 PHP
PHP常用函数总结(180多个)
2016/12/25 PHP
php基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
PHP简单实现二维数组的矩阵转置操作示例
2017/11/24 PHP
php设计模式之适配器模式原理、用法及注意事项详解
2019/09/24 PHP
jquery 简单的进度条实现代码
2010/03/11 Javascript
JS限制上传图片大小不使用控件在本地实现
2012/12/19 Javascript
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
详细解读JavaScript编程中的Promise使用
2015/07/27 Javascript
简单实现js选项卡切换效果
2016/02/03 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
2017/09/01 Javascript
Angular4表单验证代码详解
2017/09/03 Javascript
react+redux的升级版todoList的实现
2017/12/18 Javascript
vue 标签属性数据绑定和拼接的实现方法
2018/05/17 Javascript
JS正则表达式常见用法实例详解
2018/06/19 Javascript
如何在js代码中消灭for循环实例详解
2018/07/29 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
[01:22:42]2014 DOTA2华西杯精英邀请赛 5 24 DK VS LGD
2014/05/26 DOTA
举例讲解Python编程中对线程锁的使用
2016/07/12 Python
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
python3+PyQt5泛型委托详解
2018/04/24 Python
详解Python if-elif-else知识点
2018/06/11 Python
python得到单词模式的示例
2018/10/15 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
Python中xml和dict格式转换的示例代码
2019/11/07 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
2019/12/12 Python
python excel多行合并的方法
2020/12/09 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
css3过渡_动力节点Java学院整理
2017/07/11 HTML / CSS
新驾驶员个人自我评价
2014/01/03 职场文书
师范生小学见习总结
2015/06/23 职场文书
2019年年中职场激励人心语录30条
2019/08/07 职场文书
PostgreSQL数据库创建并使用视图以及子查询
2022/04/11 PostgreSQL