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__中进行实例化去占用内存,所以类变量的一大作用就是节省内存开销。如果有某个实例的该属性与其他实例不同时,只需要单独对该实例的该参数进行单独赋值即可。

猜你喜欢

转载自www.cnblogs.com/auqarius/p/9045004.html