简单分析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实现域名系统(DNS)正向查询的方法
Apr 19 Python
Python如何快速实现分布式任务
Jul 06 Python
详解如何使用Python编写vim插件
Nov 28 Python
JavaScript实现一维数组转化为二维数组
Apr 17 Python
Python 读取某个目录下所有的文件实例
Jun 23 Python
Pycharm 设置默认头的图文教程
Jan 17 Python
Python实现bilibili时间长度查询的示例代码
Jan 14 Python
Python实现企业微信机器人每天定时发消息实例
Feb 25 Python
Python基于numpy模块实现回归预测
May 14 Python
Python如何读写字节数据
Aug 05 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
Sep 03 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
Oct 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
一个简洁的多级别论坛
2006/10/09 PHP
PHP面向对象概念
2011/11/06 PHP
php后退一页表单内容保存实现方法
2012/06/17 PHP
php/js获取客户端mac地址的实现代码
2013/07/08 PHP
php根据指定位置和长度获得子字符串的方法
2015/03/17 PHP
PHP后端银联支付及退款实例代码
2017/06/23 PHP
IE 下的只读 innerHTML
2009/08/21 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
Jquery实现仿新浪微博获取文本框能输入的字数代码
2013/02/22 Javascript
js实现上传图片之上传前预览图片
2013/03/25 Javascript
jquery cookie实现的简单换肤功能适合小网站
2013/08/25 Javascript
选择复选框按钮置灰否则按钮可用
2014/05/22 Javascript
alert出数组中的随即值代码
2014/09/25 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
2015/06/26 Javascript
JS学习之表格的排序简单实例
2016/05/16 Javascript
使用jQuery加载html页面到指定的div实现方法
2016/07/13 Javascript
jQuery中deferred对象使用方法详解
2016/07/14 Javascript
JS中from 表单序列化提交的代码
2017/01/20 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
JavaScript实现数组全排列、去重及求最大值算法示例
2018/07/30 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
Python编程修改MP3文件名称的方法
2017/04/19 Python
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
Python中进程和线程的区别详解
2017/10/29 Python
python 列表删除所有指定元素的方法
2018/04/19 Python
python实现生成Word、docx文件的方法分析
2019/08/30 Python
python中怎么表示空值
2020/06/19 Python
HTML5中判断用户是否正在浏览页面的方法
2014/05/03 HTML / CSS
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
Interhome丹麦:在线预订度假屋和公寓
2019/07/18 全球购物
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
北京奥运会主题口号
2014/06/13 职场文书
文明社区申报材料
2014/08/21 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书
MySQL 重命名表的操作方法及注意事项
2021/05/21 MySQL