简单分析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中的join()方法的使用
May 19 Python
python基础入门学习笔记(Python环境搭建)
Jan 13 Python
理解python正则表达式
Jan 15 Python
利用python程序生成word和PDF文档的方法
Feb 14 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
Nov 30 Python
Python实现简单网页图片抓取完整代码实例
Dec 15 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
Mar 09 Python
在matplotlib中改变figure的布局和大小实例
Apr 23 Python
python IDLE添加行号显示教程
Apr 25 Python
Python爬取YY评级分数并保存数据实现过程解析
Jun 01 Python
Pytorch mask-rcnn 实现细节分享
Jun 24 Python
Python matplotlib模块及柱状图用法解析
Aug 10 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
曾在DC漫画界反派角色扮演的演员,谁才是你心目中的小丑之王?
2020/04/09 欧美动漫
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
PHP autoload使用方法及步骤详解
2020/09/05 PHP
js left,right,mid函数
2008/06/10 Javascript
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
js由下向上不断上升冒气泡效果实例
2015/05/07 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
AngularJS控制器详解及示例代码
2016/08/16 Javascript
jstl中判断list中是否包含某个值的简单方法
2016/10/14 Javascript
javascript实现日期三级联动下拉框选择菜单
2020/12/03 Javascript
日期时间范围选择插件:daterangepicker使用总结(必看篇)
2017/09/14 Javascript
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
vue生命周期的探索
2019/04/03 Javascript
Layui 解决表格异步调用后台分页的问题
2019/10/26 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
Vue.js中的高级面试题及答案
2020/01/13 Javascript
vue select 获取value和lable操作
2020/08/28 Javascript
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
[10:34]DOTA2上海特级锦标赛全纪录
2016/03/25 DOTA
[03:46]DAC趣味视频-中文考试.mp4
2017/04/02 DOTA
Python之re操作方法(详解)
2017/06/14 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
解决PyCharm同目录下导入模块会报错的问题
2018/10/13 Python
python basemap 画出经纬度并标定的实例
2019/07/09 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
Python任务调度模块APScheduler使用
2020/04/15 Python
python字符串的index和find的区别详解
2020/06/20 Python
python识别验证码的思路及解决方案
2020/09/13 Python
scrapy redis配置文件setting参数详解
2020/11/18 Python
css3.0 图形构成实例练习二
2013/03/19 HTML / CSS
HTML5新增属性data-*和js/jquery之间的交互及注意事项
2017/08/08 HTML / CSS
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
你所知道的集合类都有哪些?主要方法?
2012/12/31 面试题
房地产项目策划书
2014/02/05 职场文书
2016年教师政治思想表现评语
2015/12/02 职场文书