简单分析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 文件和输入输出小结
Oct 09 Python
python基于mysql实现的简单队列以及跨进程锁实例详解
Jul 07 Python
Python多进程通信Queue、Pipe、Value、Array实例
Nov 21 Python
Python单例模式实例分析
Jan 14 Python
spyder常用快捷键(分享)
Jul 19 Python
解决python3运行selenium下HTMLTestRunner报错的问题
Dec 27 Python
基于Python打造账号共享浏览器功能
May 30 Python
连接pandas以及数组转pandas的方法
Jun 28 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
Sep 25 Python
在keras中实现查看其训练loss值
Jun 16 Python
python 实现aes256加密
Nov 27 Python
python 破解加密zip文件的密码
Apr 22 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
php 正则表达式小结
2009/08/31 PHP
php利用单例模式实现日志处理类库
2014/02/10 PHP
php实例分享之二维数组排序
2014/05/15 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
2014/08/21 PHP
PHP对象、模式与实践之高级特性分析
2016/12/08 PHP
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
JavaScript实现的简单烟花特效代码
2015/10/20 Javascript
jquery横向纵向鼠标滚轮全屏切换
2017/02/27 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
JavaScript基础之this详解
2017/06/04 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
vue3修改link标签默认icon无效问题详解
2019/10/09 Javascript
原生JS实现九宫格抽奖
2020/09/13 Javascript
JavaScript实现单点登录的示例
2020/09/23 Javascript
Openlayers实现点闪烁扩散效果
2020/09/24 Javascript
vuex Module将 store 分割成模块的操作
2020/12/07 Vue.js
python实现的登录和操作开心网脚本分享
2014/07/09 Python
关于你不想知道的所有Python3 unicode特性
2014/11/28 Python
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
python实现查找两个字符串中相同字符并输出的方法
2015/07/11 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
2018/03/14 Python
Python实现的json文件读取及中文乱码显示问题解决方法
2018/08/06 Python
Python魔法方法详解
2019/02/13 Python
python实现远程控制电脑
2019/05/23 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
HTML5的hidden属性兼容老浏览器的方法
2014/04/23 HTML / CSS
个人自我鉴定怎么写
2013/10/28 职场文书
《九寨沟》教学反思
2014/04/08 职场文书
讲文明知礼仪演讲稿
2014/09/13 职场文书
物资采购管理制度
2015/08/06 职场文书
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫
python字符串的一些常见实用操作
2022/04/06 Python