今天在看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类变量和实例变量的更多相关文章

  1. Python类变量,实例变量,类方法,实例方法,静态方法的分析

    Python作为动态语言,跟静态语言如c/c++有很大区别,其中的一个重要的特性就是Python的变量无需声明直接可用.同样,类的成员变量无需声明,直接可用.目的是为了动态语言跟灵活,在思路想到的时候 ...

  2. Python类变量与实例变量及成员函数修饰方式说明(与Java定义方式进行类比)

    Python类中的变量有类变量和实例变量之分. 类变量:变量绑定在类上,同一个类之间的共享变量,类比于Java中的静态变量static 公有变量定义 Java 的定义方式 class Test{ pu ...

  3. Python类变量和实例变量

    class TestClass(object):     val1 = 100  #类变量 def __init__(self):         self.val2 = 200  #实例变量     ...

  4. python类变量和实例变量的区别

    类变量:是为类服务的,类所有的实例都共享使用,在一个地方被改变,所有调用的地方变量值都改变.定义类时的写法为类名.变量名 实例变量:是在实例中生效的,每个实例变量的值都根据实例本身需求进行修改,不会影 ...

  5. python 类变量和实例变量

    super(cls, inst) 获得的是 cls 在 inst 的 MRO 列表中的下一个类.  实例的属性存储在实例的__dict__中,类属性和方法存储在类的__dict__中.查找属性时,先检 ...

  6. 【类不类二】Python的类变量与实例变量

    在研究类的时候,难免会有很多疑问,C论坛和博客园高手如云(不知道是不是也美女如云), 搜到了这篇博文,是介绍Python的类变量和实例变量的 ! 刚好在下对self.***这种形式的实例变 量不是很理 ...

  7. python(四)类变量和实例变量

    转载自[1] 实际这是个实例变量是否指向类变量的问题. python的类变量和实例变量,顾名思义,类变量是指跟类的变量,而实例变量,指跟类的具体实例相关联的变量,具体体现为self.x 等.实际要注意 ...

  8. python中的实例方法、静态方法、类方法、类变量和实例变量

    class MyTest: myname = 'peter' # add a instance attribute    def __init__(self, name):        self.n ...

  9. Python基础-类变量和实例变量

    Python基础-类变量和实例变量 写在前面 如非特别说明,下文均基于Python3 大纲: 1. 类变量和实例变量 在Python Tutorial中对于类变量和实例变量是这样描述的: Genera ...

随机推荐

  1. 十、ABP

    一.官网 安装 安装成功Core 2.2版本的

  2. jqGrid选中行、格式化、自定义按钮、隐藏

    获取选择一行的id: var id=$('#jqGrid').jqGrid('getGridParam','selrow'); 获取选择多行的id: var ids=$('#jqGrid').jqGr ...

  3. 关于构造器中的super()

    1.为什么在子类的constructor里面要加一句super()? 答:如果子类用了extends的关键字继承的父类,那么子类在使用构造器的时候就要加super()语句,这是语法规范,就是这么定的. ...

  4. avpicture_fill的实现

    简介 avpicture_fill函数将ptr指向的数据填充到picture内,但并没有拷贝,只是将picture结构内的data指针指向了ptr的数据.其实现如下: avpiture_fill av ...

  5. FTP登录不上 显示“找不到元素”

    FTP登录不上 显示“找不到元素” 问题描述: 资源管理器登陆不上ftp服务器,ie现在打不开网页(包括普通的网页和ftp)360等其他浏览器可以正常打开网页. 解决方法: 应该是用了代理软件的问题, ...

  6. springMVC (优秀篇)

    本文依然是复制的 Spring3 MVC结构简单,应了那句话简单就是美,而且他强大不失灵活,性能也很优秀. 官方的下载网址是:http://www.springsource.org/download  ...

  7. 洛谷P1373小a和uim大逃离题解

    题目 这个题好坑啊,首先是他会卡空间,然后我们就只能把一种比较好理解的状态给舍弃,因为空间开不下,然而采用一种难理解的状态就是\(dp[i][j][l][0/1]\)表示\(i\),\(j\)位置,两 ...

  8. GGS-DDU HDU - 4966

    GGS-DDU Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total S ...

  9. Python课程目录

    Python基础1 介绍.基本语法.流程控制 Python基础2 列表.字典.集合 Python基础3 基础3-函数

  10. 【XSY2730】Ball 多项式exp 多项式ln 多项式开根 常系数线性递推 DP

    题目大意 一行有\(n\)个球,现在将这些球分成\(k\) 组,每组可以有一个球或相邻两个球.一个球只能在至多一个组中(可以不在任何组中).求对于\(1\leq k\leq m\)的所有\(k\)分别 ...