关于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)
突然想了一下,貌似类的全局变量,并没有什么使用场景啊。