关于python类变量和实例变量
今天在看python的类和实例的时候,突然发现了一个以前遗漏的点,也就是类变量和实例变量。首先需要理解一下类变量和实例变量的概念。
- 类全局变量:在类中定义,对类和由类生成的实例生效,如果通过方法对类变量进行修改,修改之后会影响类和对应的实例
- 类局部变量:在类的构造函数中创建的变量,只对由类创建的实例生效
- 实例变量:由类生成的实例,在实例之后定义、修改的,不会影响类中的变量值。
来看一个比较直接的例子,定义一个Dog类,然后在类中定义一个类变量(随意就好),size,然后基于这个类,创建两个实例对象d1和d2,然后分别查看一下这个size变量值。
class Dog():
size = []
def __init__(self,name):
self.name = name
d1 = Dog("A")
d1.size.append("A")
print(d1.size)
d2 = Dog("B")
print(d2.size)
d2.size.append("B")
print(d1.size,d2.size)
在上面的这段代码中,由于是使用了类变量,这样输出结果,由于d1直接增加了A,所以输出的时候是A,这个时候类变量size已经是["A"]了,当创建第二个对象d2的时候,如果直接调用d2.size,则调用的是类的变量。可以看一下结果。

通过这个结果,我们可以看到,d2的size属性值中,有d1的size属性,而此时的类Dog的size属性,则是两个对象d1和d2修改之后的size值,这个时候会有一个结果,也就是d1.size == d2.size ==Dog.size,因为他们修改的是同一个属性值。
如果这个时候,对象d1直接创建一个新的属性值new_size,然后赋值为a,对象d2和类Dog是不会有这个属性值的。
这个时候,我们就可以知道,
- new_size是一个实例变量,只对实例d1生效,实例可以自行定义一些属性变量,只对自己生效,而不对类或者由类创建的其他实例产生影响。
- size是一个类全局变量,对整个类和由类生成的对象都是有效的,一旦某个实例对该属性变量进行了修改,相对应的还是会对类和其他实例产生影响。
- 类全局变量和全局变量相比,都是修改了直接生效,下次调用的时候已经是被修改的值,类变量只能通过类或者是对象实例来修改,全局变量可以直接被修改。
- 在类的构造函数init中,如果定义的变量,是类的局部变量,这个类局部变量,在类实例化对象的时候,会赋值给对象,以后对象对该属性值的修改,不会影响类,也不会影响由类创建的其他实例,而且,这个类局部变量,类是无法修改的。
class Dog():
def __init__(self,name):
size = []
self.name = name
self.size = size
d1 = Dog("A")
d1.size.append("A")
print(d1.size)
d2 = Dog("B")
print(d2.size)
d2.size.append("B")
print(d1.size,d2.size)

突然想了一下,貌似类的全局变量,并没有什么使用场景啊。
关于python类变量和实例变量的更多相关文章
- Python类变量,实例变量,类方法,实例方法,静态方法的分析
Python作为动态语言,跟静态语言如c/c++有很大区别,其中的一个重要的特性就是Python的变量无需声明直接可用.同样,类的成员变量无需声明,直接可用.目的是为了动态语言跟灵活,在思路想到的时候 ...
- Python类变量与实例变量及成员函数修饰方式说明(与Java定义方式进行类比)
Python类中的变量有类变量和实例变量之分. 类变量:变量绑定在类上,同一个类之间的共享变量,类比于Java中的静态变量static 公有变量定义 Java 的定义方式 class Test{ pu ...
- Python类变量和实例变量
class TestClass(object): val1 = 100 #类变量 def __init__(self): self.val2 = 200 #实例变量 ...
- python类变量和实例变量的区别
类变量:是为类服务的,类所有的实例都共享使用,在一个地方被改变,所有调用的地方变量值都改变.定义类时的写法为类名.变量名 实例变量:是在实例中生效的,每个实例变量的值都根据实例本身需求进行修改,不会影 ...
- python 类变量和实例变量
super(cls, inst) 获得的是 cls 在 inst 的 MRO 列表中的下一个类. 实例的属性存储在实例的__dict__中,类属性和方法存储在类的__dict__中.查找属性时,先检 ...
- 【类不类二】Python的类变量与实例变量
在研究类的时候,难免会有很多疑问,C论坛和博客园高手如云(不知道是不是也美女如云), 搜到了这篇博文,是介绍Python的类变量和实例变量的 ! 刚好在下对self.***这种形式的实例变 量不是很理 ...
- python(四)类变量和实例变量
转载自[1] 实际这是个实例变量是否指向类变量的问题. python的类变量和实例变量,顾名思义,类变量是指跟类的变量,而实例变量,指跟类的具体实例相关联的变量,具体体现为self.x 等.实际要注意 ...
- python中的实例方法、静态方法、类方法、类变量和实例变量
class MyTest: myname = 'peter' # add a instance attribute def __init__(self, name): self.n ...
- Python基础-类变量和实例变量
Python基础-类变量和实例变量 写在前面 如非特别说明,下文均基于Python3 大纲: 1. 类变量和实例变量 在Python Tutorial中对于类变量和实例变量是这样描述的: Genera ...
随机推荐
- git 提交的步骤
1. git init //初始化仓库 2. git add .(文件name) //添加文件到本地仓库 3. git commit -m "first commit" / ...
- Nginx 如何处理上游响应的数据
陶辉93 一个非常重要的指令 proxy_buffer_size 指令限制头部响应header最大值 proxy_buffering 指令主要是指 上游服务器是否接受完完整包体在处理 默认是on 也就 ...
- sws_getContext函数参数介绍
原型: SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat, int dstW, int dstH, ...
- C#使用读写锁解决多线程并发写入文件时线程同步的问题
读写锁是以 ReaderWriterLockSlim 对象作为锁管理资源的,不同的 ReaderWriterLockSlim 对象中锁定同一个文件也会被视为不同的锁进行管理,这种差异可能会再次导致文件 ...
- kebu之rook-ceph
准备工作 所有节点开启ip_forward cat <<EOF > /etc/sysctl.d/ceph.conf net.ipv4.ip_forward = 1 net.bridg ...
- 蒟阵P3390 【模板】矩阵快速幂
代码如下: #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> ...
- thymeleaf中js跳转到另外一个页面
<script type="text/javascript"> setTimeout("location.href='index'", 3000); ...
- 【题解】 bzoj2462: [BeiJing2011]矩阵模板
题面戳我 Solution 二维矩阵\(hash\),判断即可 自己YY了一个方法,\(bzoj\)T到飞,(一开始还用的三\(hash\)),交到luogu貌似跑的不慢啊qwq (我是不会告诉你全输 ...
- 【Luogu3732】[HAOI2017]供给侧改革(Trie树)
[Luogu3732][HAOI2017]供给侧改革(Trie树) 题面 洛谷 给定一个纯随机的\(01\)串,每次询问\([L,R]\)之间所有后缀两两之间的\(LCP\)的最大值. 题解 一个暴力 ...
- Nginx log日志切割shell
#!/bin/bash#此脚本用于自动分割Nginx的日志,包括access.log和error.log#每天00:00执行此脚本 将前一天的access.log重命名为access-xxxx-xx- ...