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

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

时间: 2024-10-03 22:54:26

Python 类变量与实例变量的区别和用途的相关文章

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

类变量:是为类服务的,类所有的实例都共享使用,在一个地方被改变,所有调用的地方变量值都改变.定义类时的写法为类名.变量名 实例变量:是在实例中生效的,每个实例变量的值都根据实例本身需求进行修改,不会影响其他实例,定义类时的写法为self.变量名 (1)定义一个类 class C: a = 0   #类变量 b = 0   #类变量 def __init__(self, flag): self.a = flag   #实例变量 C.a = 1         #类变量赋值 C.b = 1     

类变量和实例变量的区别

1.简介:       1.类变量也叫静态变量,也就是在变量前加了static 的变量:       2.实例变量也叫对象变量,即没加static 的变量: 区别在于:类变量和实例变量的区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果:而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象: 例: 1 public class A{ 2 static int a = 0; //类变量 3 private int b = 0; //实力变量 4 } 5

【JAVA·转】类变量和实例变量的区别

类变量和实例变量的区别 类变量也叫静态变量,也就是在变量前加了static 的变量:实例变量也叫对象变量,即没加static 的变量:区别在于:    类变量和实例变量的区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果:而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象:例:public class A{    static  int a = 0; //类变量    private int b = 0; //实力变量} public class B

Python类变量和实例变量区别

深入理解python类的实例变量和类变量 Python变量的本质:被赋值1 普通python变量(非类相关变量)很容易理解,在被赋值后即变量存在,可读可写2 Python类的变量(类变量和实例对象变量)以某种方式在某地方被赋值,即存在,可被读写2.1 Python类变量被赋值     (1)类的设计里,             class里def外,通过变量名能被赋值             def里通过类对象即类名字的点运算变量名可被赋值      (2)程序里             通过类

Python类变量与实例变量及成员函数修饰方式说明(与Java定义方式进行类比)

Python类中的变量有类变量和实例变量之分. 类变量:变量绑定在类上,同一个类之间的共享变量,类比于Java中的静态变量static 公有变量定义 Java 的定义方式 class Test{ public static class_variable = "123" } Python3 定义方式 class Test: class_variable = "123" 私有变量定义 Java 的定义方式 class Test{ private static class

python 类变量和实例变量

实例的属性存储在实例的__dict__中,类属性和方法存储在类的__dict__中.查找属性时,先检查特性,然后实例的__dict__,然后类的__dict__,然后基类.都不存在就会抛出异常. print '***************************************************' class AA: count = 0 def __init__(self): pass def AddCount(self): print 'id -> self.__class__

python 类变量与实例变量,可变对象与不可变对象的实践

class E: s='' d=[] def __init__(self): self.dd=[] aa=E() aa.d.append('abc') aa.dd.append('abc') aa.s+='abc' print(aa.d) print(aa.dd) print(aa.s) print('='*20) print(E.d) print(E.s) print('='*20) aa=E() aa.d.append('123') aa.dd.append('123') aa.s+='12

Java 局部变量、实例变量、类变量(静态变量)区别

1. 局部变量: 局部变量是类的方法中的变量: 2. 实例变量: 实例变量也是类中独立于方法之外的变量,不过没有static修饰,也叫 对象变量 3. 类变量(静态变量): 类变量是类中独立于方法之外的变量,用static 修饰,也叫 静态变量 4. 伪代码说明 public class Variable{ static int allClicks=0;//类变量 String str="hello world";//实例变量 public void method(){ int i =

Python类变量和成员变量使用中有哪些注意事项?

之前在用python开发一个项目,发现一个bug,就是同由一个类生成的两个实例之间的数据竟然会相互影响,这让我非常不解.后来联想到java的类有类变量也有实例变量,因此翻阅了相关资料,发现python也有类似的类变量和实例变量,比如下面的代码中: class A: x = 0 def __init__(self): self.y = 0 x就是类变量,y就是实例变量. 原则上是没有错的,但是实际用的时候就发现一些恶心的问题(也就是我找了三天的bug)...比如下面的代码: class A: x