今天在看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. oracle 触发器详情

    Oracle PL/SQL编程之八: 把触发器说透 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触 ...

  2. codeforces379C

    New Year Ratings Change CodeForces - 379C One very well-known internet resource site (let's call it ...

  3. python 项目启动路径自动添加

    import os import sys base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  #找到当前项目 ...

  4. Codeforces Round #540 Div. 3 F2

    考虑将每种颜色构成的极小连通块缩点,然后直接跑树形dp即可,即f[i][0/1]表示子树内是否有颜色向上延伸时删边的方案数.dp时需要去除某点的贡献,最好用前后缀积的做法而不是求逆. 至于如何缩点,假 ...

  5. Hibernate 注解映射

    工作中遇到hibernate映射的一些问题,这里总结一下 (特别是测试时,许多数据并不能有效关联.所以@NotFound 很重要) 一,假设有2张表user,company 我们知道,一个用户属于一个 ...

  6. 【XSY1529】小Q与进位制 分治 FFT

    题目大意 ​ 小Q发明了一种进位制,每一位的变化范围是\(0\)~\(b_i-1\),给你一个这种进位制下的整数\(a\),问你有多少非负整数小于\(a\).结果以十进制表示. ​ \(n\leq 1 ...

  7. Educational Codeforces Round 58 A,B,C,D,E,G

    A. Minimum Integer 链接:http://codeforces.com/contest/1101/problem/A 代码: #include<bits/stdc++.h> ...

  8. groovy的效率问题

    刚开始学groovy,知道了它会先变异成class 文件,然后再用jvm 执行.写了Hello World程序,查看它的编译文件,发现groovy的效率挺低的.不但编译文件的代码多,而且需要依赖很多g ...

  9. php 部署在iis HTTP 错误 500.0 - Internal Server Error 无法在<fastCGI>应用程序配置中找到<handler> scriptProcessor

    原因,从A服务器复制一个部署在IIS上的PHP项目,根节点指向 publc/web.config 把里面涉及的  php路径改成正确的即可

  10. 「POJ-3608」Bridge Across Islands (旋转卡壳--求两凸包距离)

    题目链接 POJ-3608 Bridge Across Islands 题意 依次按逆时针方向给出凸包,在两个凸包小岛之间造桥,求最小距离. 题解 旋转卡壳的应用之一:求两凸包的最近距离. 找到凸包 ...