码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-05-16 12:54:05      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:实例化   .com   自身   elf   有一个   占用   实例变量   init   没有   

假设有一个类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 类变量与实例变量的区别和用途

标签:实例化   .com   自身   elf   有一个   占用   实例变量   init   没有   

原文地址:https://www.cnblogs.com/auqarius/p/9045004.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!