Python 类变量与实例变量的区别和用途

Posted auqarius

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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__中进行实例化去占用内存,所以类变量的一大作用就是节省内存开销。如果有某个实例的该属性与其他实例不同时,只需要单独对该实例的该参数进行单独赋值即可。

 

以上是关于Python 类变量与实例变量的区别和用途的主要内容,如果未能解决你的问题,请参考以下文章

Python中静态方法和类方法的区别

Python类变量和实例变量区别

python类变量和实例变量的区别

Python里类变量和实例变量的区别

JAVA类与对象---实例变量与类变量的区别,实例方法和类方法的区别

成员变量、实例变量和属性变量的区别