简单分析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基础教程之类class定义使用方法
Feb 20 Python
Python实现设置windows桌面壁纸代码分享
Mar 28 Python
Python中read()、readline()和readlines()三者间的区别和用法
Jul 30 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
Nov 16 Python
python利用高阶函数实现剪枝函数
Mar 20 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
Jan 10 Python
python中文分词库jieba使用方法详解
Feb 11 Python
AUC计算方法与Python实现代码
Feb 28 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
May 22 Python
matplotlib.pyplot.matshow 矩阵可视化实例
Jun 16 Python
python os.rename实例用法详解
Dec 06 Python
Python字符串的15个基本操作(小结)
Feb 03 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 __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
优化PHP程序的方法小结
2012/02/23 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
对于PHP 5.4 你必须要知道的
2013/08/07 PHP
php实现表单多按钮提交action的处理方法
2015/10/24 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
2019/06/25 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
2013/04/08 Javascript
JavaScript限定复选框的选择个数示例代码
2013/08/25 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
Bootstrap布局方式详解
2016/05/27 Javascript
JS实现控制文本框的内容
2016/07/10 Javascript
Angularjs 设置全局变量的方法总结
2016/10/20 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
Angular4开发解决跨域问题详解
2017/08/28 Javascript
react-native-video实现视频全屏播放的方法
2018/03/19 Javascript
jQuery实现动态生成年月日级联下拉列表示例
2019/05/11 jQuery
利用JavaScript的Map提升性能的方法详解
2019/08/14 Javascript
layui数据表格跨行自动合并的例子
2019/09/02 Javascript
[01:20:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第四场 8.26
2018/08/30 DOTA
用实例说明python的*args和**kwargs用法
2013/11/01 Python
详解Python验证码识别
2016/01/25 Python
python版微信跳一跳游戏辅助
2018/01/11 Python
Python使用pickle模块存储数据报错解决示例代码
2018/01/26 Python
使用Python将Mysql的查询数据导出到文件的方法
2019/02/25 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
python实现同一局域网下传输图片
2020/03/20 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
Python爬虫教程之利用正则表达式匹配网页内容
2020/12/08 Python
求职面试个人自我评价
2014/02/28 职场文书
2014年党员公开承诺书范文
2014/03/28 职场文书
导游词之南京中山陵
2019/11/27 职场文书
Python基础知识学习之类的继承
2021/05/31 Python
webpack的移动端适配方案小结
2021/07/25 Javascript