简单分析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利用hook技术破解https的实例代码
Mar 25 Python
Python中os和shutil模块实用方法集锦
May 13 Python
python3.0 模拟用户登录,三次错误锁定的实例
Nov 02 Python
Python实现从log日志中提取ip的方法【正则提取】
Mar 31 Python
基于python代码实现简易滤除数字的方法
Jul 17 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
python+numpy+matplotalib实现梯度下降法
Aug 31 Python
对matplotlib改变colorbar位置和方向的方法详解
Dec 13 Python
使用python接入微信聊天机器人
Mar 31 Python
Python 矩阵转置的几种方法小结
Dec 02 Python
QML用PathView实现轮播图
Jun 03 Python
Python使用文件操作实现一个XX信息管理系统的示例
Jul 02 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 is_dir() 判断给定文件名是否是一个目录
2010/05/10 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
2010/11/01 PHP
PHP代码优化的53个细节
2014/03/03 PHP
PHP学习笔记(二):变量详解
2015/04/17 PHP
全面解读PHP的Yii框架中的日志功能
2016/03/17 PHP
php使用pear_smtp发送邮件
2016/04/15 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
提高Laravel应用性能方法详解
2019/06/24 PHP
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
2007/08/13 Javascript
js实现简单模态窗口,背景灰显
2008/11/14 Javascript
jQuery EasyUI之DataGrid使用实例详解
2016/01/04 Javascript
详解EasyUi控件中的Datagrid
2017/08/23 Javascript
Vue2 SSR渲染根据不同页面修改 meta
2017/11/20 Javascript
JavaScript设计模式之观察者模式实例详解
2019/01/16 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
2019/05/30 NodeJs
javascript实现的字符串转换成数组操作示例
2019/06/13 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
[02:12]2015国际邀请赛 SHOWOPEN
2015/08/05 DOTA
[01:00:30]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第二场 10.31
2020/11/02 DOTA
Python文件夹与文件的操作实现代码
2014/07/13 Python
简单介绍Python中的try和finally和with方法
2015/05/05 Python
Pycharm学习教程(2) 代码风格
2017/05/02 Python
python 第三方库的安装及pip的使用详解
2017/05/11 Python
python学生信息管理系统(初级版)
2018/10/17 Python
pandas删除指定行详解
2019/04/04 Python
Python多线程threading模块用法实例分析
2019/05/22 Python
Pandas之Fillna填充缺失数据的方法
2019/06/25 Python
python中time库的实例使用方法
2019/10/31 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
2020/02/26 Python
python 按钮点击关闭窗口的实现
2020/03/04 Python
Python 中如何写注释
2020/08/28 Python
高二英语教学反思
2014/01/19 职场文书
农村文化活动总结
2014/08/28 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书
PHP控制循环操作的时间
2021/04/01 PHP