Python 类变量与实例变量的区别和用途
假设有一个类Eg:
class Eg: n = 'abcd' def __init__(self,name): self.name = name
两个实例a和b:
a = Eg('a') b = Eg('b')
那么name就是实例变量,n就是类变量。在生成实例的过程中,类变量存储在类的内存位置中,而实例变量存储在实例内存位置中。
此时,打印两个实例的n值,实例会从类的内存位置去取值,所以值都为abcd:
print(a.n , b.n) >>abcd abcd
当在a的实例中修改n的赋值时,类的n值会变吗?可以看下一段代码:
class Eg: n = 'abcd' def __init__(self,name): self.name = name a = Eg('a') b = Eg('b') print(a.n,b.n) a.n = 'efgh' #只改变a实例中的n print(Eg.n, a.n , b.n) >>abcd abcd >>abcd efgh abcd
可以看到只有a.n的值产生了变化,可以判断,修改a.n的赋值只会等同于在a的内存中新增一个n变量并赋值为‘efgh’,也就是原本a.n只是映射的Eg.n,而一旦改变a.n,则由映射关系变成了自身的赋值。而没有发生变化的b实例中,仍然会去类的内存中取值,也就是如下图:
所以,此时如果改变类中的n值,可以想见在打印a.n和b.n时会发生什么:
class Eg: n = 'abcd' def __init__(self,name): self.name = name a = Eg('a') b = Eg('b') print(a.n,b.n) a.n = 'efgh' print(Eg.n, a.n , b.n) Eg.n = 'abcdefgh' #改变类中的n print(Eg.n, a.n , b.n) >>abcd abcd >>abcd efgh abcd >>abcdefgh efgh abcdefgh
类变量和实例变量的区别就是内存的位置不同,那么这个不同带来的作用也就显而易见。
当需要产生很多同类实例时,如果有一个属性是共有属性,那么就不用在__init__中进行实例化去占用内存,所以类变量的一大作用就是节省内存开销。如果有某个实例的该属性与其他实例不同时,只需要单独对该实例的该参数进行单独赋值即可。