在python中、实例变量在类的内部通过_【python】类变量、实例变量

本文介绍了Python中类变量和实例变量的概念及访问方式。类变量是所有实例共享的,可以通过类名或self访问,但使用self改变值时会变成实例变量。实例变量仅对当前实例生效,通过self访问。类变量的修改不会影响实例变量,实例变量之间相互独立。
摘要由CSDN通过智能技术生成

1、类变量、实例变量概念

类变量:

类变量就是定义在类中,但是在函数体之外的变量。通常不使用self.变量名赋值的变量。类变量通常不作为类的实例变量的,类变量对于所有实例化的对象中是公用的。

实例变量:

实例变量是定义在方法中的变量,使用self绑定到实例上的变量,只是对当前实例起作用。

2、访问

类变量

在类的内部和外部类变量都可以直接使用className.类变量的形式访问。但是在类的内部,也可以使用self.类变量来访问,但是这个是用含义就不同了(后面使用代码验证)。

实例变量

在类的内部,实例变量self.实例变量的形式访问;在类的外部使用对象名。实例变量的形式访问。实例变量是绑定到一个实例上的变量,它只是属于这个绑定的实力。而区别类变量的就是类变量是所有的来自用一个类的实例所共享。我们看到这里会有这样的疑问!

如果说类变量对所有来自这个类的所有实例所共享,那么假如我一个实例去改变了这个类变量(假设使用这样的操作object.类变量 = value)的值,那么对于其他的实例是不是都是可见的?

答案是否定的,下面验证。

class A(object):

# 定义一个类变量,初值是10

class_var = 10

print id(class_var)

def foo(self):

print '在类中访问类变量:A.class_var=', A.class_var

print '在类中访问实例变量: self.class_var=', self, self.class_var

# 改变实例变量的值

self.class_var = 40

print '修改后访问类变量:A.class_var=', A.class_var

print '修改后访问实例变量 self.class_var=',self, self.class_var

# 这里的class_var和函数外面的class_var不是同一个东西,这是一个局部变量

class_var = 20

print id(class_var)

print 'class_var=', class_var

A.class_var = 15

print 'A.class_var=', A.class_var

print 'class_var=',class_var

print 'self.class_var=',self.class_var

obj1 = A()

obj2 = A()

obj3 = A()

obj1.foo()

print A.class_var

print obj1.class_var

print obj2.class_var

print obj3.class_var

Output:

49964144

在类中访问类变量:A.class_var= 10

在类中访问实例变量: self.class_var= <__main__.a object at> 10

修改后访问类变量:A.class_var= 10

修改后访问实例变量 self.class_var= <__main__.a object at> 40

49963904

class_var= 20

A.class_var= 15

class_var= 20

self.class_var= 40

15

40

15

15

从上面运行的结果分析:当使用self.class_var形式访问类变量的之后,如果修改self.class_var的值,可以发现,类变量的值没有变化;不放心我们在修改类变量的值,发现self.class_var的值也没有受到影响。

从最后打印obj2和obj3这两个都来自于一个类的实例中的类变量都是和修改后的类变量一样,表示他们是共享类变量的。

3、总结

1、类变量可以使用className.类变量和self.类变量两种方式访问。

2、如果使用self.类变量的方式访问并重新赋值后,这个变量就会成为实例变量和self绑定,实际上就变成了一个实例变量,实例变量会屏蔽掉类变量的值。

3、类变量是共享的,最好使用类名的方式来访问类变量。

4、类变量通过sel访问时,就会被转化成实力变量,被绑定到特定的实例上。

5、实例变量(self)的形式对类变量重新赋值后,类变量的值不会随之变化。

6、实例变量对每一个对象是不可见的,每一个对象拥有着可能不同的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值