今天在看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. c#处理json数据最好的方式,没有之一。

    c#处理json数据最好的方式,没有之一. 引用Json.Net(需要.NET 4.5及以上版本) using Newtonsoft.Json.Linq; 使用非常简单 JObject result ...

  2. Vasya and a Tree CodeForces - 1076E(线段树+dfs)

    I - Vasya and a Tree CodeForces - 1076E 其实参考完别人的思路,写完程序交上去,还是没理解啥意思..昨晚再仔细想了想.终于弄明白了(有可能不对 题意是有一棵树n个 ...

  3. 使用js主函数的原因是等文档加载完了才给里面的元素添加东西 如果不使用主函数则文档加载时候无法找到元素则不能成功给元素添加事件

    使用js主函数的原因是等文档加载完了才给里面的元素添加东西 如果不使用主函数则文档加载时候无法找到元素则不能成功给元素添加事件

  4. struts2 的struts.xml配置文件

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-/ ...

  5. Civil 3D 二次开发 创建Civil 3D 对象—— 01 —— 创建几何空间点

    这一小节,我们创建派生于CivilCreateEntityDemo的类CivilCreateCogoPoint,来创建几何空间点. 1 创建类并添加字段及方法 首先在项目资源管理器中向本项目中添加类, ...

  6. C# 电脑上提示未知发布者

    参考6楼:http://tieba.baidu.com/p/5767451198?pid=120504172126&cid=120504203560#120504203560 解决方案:mak ...

  7. 【AGC002E】Candy Piles 博弈论

    题目大意 有\(n\)堆糖果,第\(i\)堆有\(a_i\)个. 两个人轮流决策,决策分为两种: 1.选择糖果数最多的一堆糖果,并把这堆糖全吃了. 2.在每堆非空的糖果堆里拿一颗糖吃掉. 吃掉最后一颗 ...

  8. java使用Rome解析Rss的实例(转)

    Rome简介 Rome是为RSS聚合而开发的开源包,它可以支持0.91.0.92.0.93.0.94.1.0.2.0,可以说rss的版本基本上都支持了. Rss简介 RSS是站点用来和其他站点之间共享 ...

  9. 【Sichuan 2017D】Dynamic Graph

    题意 300个点的无环图,开始都是白色,每次改变某个节点的颜色(黑/白),问有多少对白点之间存在只有白点的路径. 题解 类似floyd,求出两点之间的路径条数.然后白到黑就删去对应路径,黑到白就增加对 ...

  10. QML 用QSortFilterProxyModel实现搜索功能

    搞了一晚上终于实现了,写个博客纪念一下吧. c++部分的代码: #include <QQmlApplicationEngine> #include <QQmlContext> ...