一、前言
前几天在Python交流群有个粉丝问了一个关于Python类变量和实例变量的问题,这里拿出来给大家分享下,一起学习。
这个粉丝在法国留学,所以提问是英文的,当然了英文看上去也不难,有点二级英文基础,也看得懂,实在不行,在线翻译一下也问题不大了。
二、解决过程
这里给出解答:
这里主要涉及到三个部分,类属性,实例属性,及实例属性的引用对象指向性问题。在该例中counter为类属性,__first为实例属性,print函数中的counter为实例属性的引用对象指向性问题。当ExampleClass类实例化时,__init__魔法函数会自动执行其下方的代码段,而下方代码段涉及到两种属性的变化,实例属性为该实例化对象特有的,即实例化完成后才会存在,每个实例化对象之间的实例属性是独立的,从你下方的print打印结果也能看出,实例对象.__dict__输出当前实例化对象的实例属性。而类属性只要定义完类,就已经存在,使用类.类属性可以引用该类属性,也可以进行修改,类属性是所有实例化对象共享的,在此例中每次实例化类后,ExampleClass.counter都会加1,在三次print中能看到输出值都是一样。
【月神】在这里还多了一些拓展。
在__init__中,在ExampleClass.counter += 1前添加了一行self.counter += 1;这里说明下实例属性的引用方式,在类实例化后,首先引用实例属性已有的,而如果找不到会往上寻找,即找类属性,在修改后的代码里,我为实例对象增加了一个实例属性counter,在print里的实例对象.__dict__也能看到实例属性中存在counter,而此时实例对象.counter引用到的是实例属性,而非类属性。这里再说一下为什么self.counter += 1能够正常执行,上述说到实例属性的引用会向上寻找,则进行+= 1计算时,会引用类属性,第一次实例化中,类属性下的counter为0,加1后赋值给实例属性下的counter,那么第一个实例对象的counter打印出来就是1,第二次实例化,在第一次实例化的过程中,类属性下counter也进行了加1,反映到第二次中,使用到的类属性counter此时已经为1,进行加1赋值给第二次实例属性的counter,即2,第三次类似。