简单分析python的类变量、实例变量
作者:不夜男人 发布时间:2022-12-20 20:39:56
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、实例变量对每一个对象是不可见的,每一个对象拥有着可能不同的值。
以上我们整理的知识点希望能够帮助到大家,感谢大家对脚本之家的支持。
来源:https://www.cnblogs.com/valorchang/p/11399932.html


猜你喜欢
- 尾递归是一种特殊的递归形式,它在递归调用时不会产生新的栈帧,从而避免了栈溢出的问题。Python并没有对尾递归进行优化,但我们可以通过一些技
- 前言随着人工智能的不断发展,各种智能算法越来越普遍,本文就给大家介绍一种通过训练好的算法进行文字识别的方法,而且是Web页面可视化操作,方便
- 一、前言今天我们将用Python来创建一个属于自己的音乐播放器。为此,我们将使用三个软件包:Tkinter:用于UIPygame:播放音乐o
- 本文实例讲述了原生JavaScript实现的简单省市县 * 联动功能。分享给大家供大家参考,具体如下: * 联动是我们写表单时必不可少的,比如在
- 一、前言三年.net开发转前端已经四个月了,前端主要用webpack+vue,由于后端转过来的,前端不够系统,希望分享下开发心得与园友一起学
- 本文实例为大家分享了php实现ajax图片上传的具体代码,供大家参考,具体内容如下html页面代码<!DOCTYPE html>
- 我就废话不多说了,直接上代码!from enum import Enumclass Values(): values={'
- 直接上代码:1. 第一种情况如果没有select{}, main 主线程不会等待coroutine运行,导致coroutine得不到机会运行
- sql中增删改查语句:1、“INSERT INTO”语句,用于向表格中增加新的行;2、&ld
- 使用背景逛社区发现许多人在解决删除文件夹中非图片文件,删除文件夹中图片等问题的时候,都写了很多代码取实现这一功能,我当时就纳闷了,能几行代码
- 在现代LOGO设计当中,叶子的形状被视做好的创意。或者说,是一种变革的想法。在网页中他们大多被用于轻量级的解决方案、干净的不抽像的设计。在实
- 代码import turtleturtle.bgcolor("black")turtle.pensize(2)sizeh
- 一、面相对象继承机制 这个实例使用UML很好的解释了继承机制。 &nb
- Axios.js作为Vue官方插件的AJAX组件其主要有以下几个特点:1、比Jquery轻量,但处理请求不多的时候,可以使用2、基于Prom
- 用法:DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplac
- 1.新建site-packages目录,进入到site-packages目录下;2.在site-packages目录下执行pip freez
- 变量名1、组成:数字、字母、下划线2、变量名要有意义3、多个单词则用下划线,如user_id4、python的变量名不要驼峰显示字符串:1、
- 背景:文件内容每一行是由N个单一数字组成的,每个数字之间由制表符区分,比如:0 4 3 1 2 2 1 0 3 1 2 0 ……现在需要将每
- 一、“无”的哲学佛家讲究“因果报应”,有果必有应。此段看似与主题没有血缘关系,实际讲的是“因”。我个人比较喜欢老子的道家思想,并喜欢以其思想
- 方法一使用Python中的内置函数isupper()和islower()来判断一个字母是否为大写或小写字母。# 获取用户输入letter =