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 0x0000000002FD2390> 10 修改后访问类变量:A.class_var= 10 修改后访问实例变量 self.class_var= <__main__.A object at 0x0000000002FD2390> 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、实例变量对每一个对象是不可见的,每一个对象拥有着可能不同的值。
以上我们整理的知识点希望能够帮助到大家,感谢大家对小牛知识库的支持。
问题内容: 我在下面的示例中进行了尝试,并需要进行澄清。在这两种情况下,我都可以在测试函数中访问类变量和实例。 因此,假设是否必须定义一个需要在所有函数中使用的文字,这将是定义..self变量或class变量的更好方法? code.py 问题答案: 类变量对于所有实例使用的“常量”非常有用(从技术上讲,所有方法都是如此)。您可以使用模块全局变量,但是使用类变量会使它与类更明确地关联。 您实际上也经
问题内容: 我有Python类,在运行时我只需要一个实例,因此每个类只具有一个属性就足够了,而每个实例只具有一次属性就足够了。如果将有多个实例(不会发生),则所有实例应具有相同的配置。我想知道以下哪种选择更好或更“惯用”的Python。 类变量: 实例变量: 问题答案: 我有Python类,在运行时我只需要一个实例,因此每个类只具有一个属性就足够了,而每个实例只具有一次属性就足够了。如果将有多个实
本文向大家介绍Python全局变量用法实例分析,包括了Python全局变量用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python全局变量用法。分享给大家供大家参考,具体如下: 全局变量不符合参数传递的精神,所以,平时我很少使用,除非定义常量。今天有同事问一个关于全局变量的问题,才发现其中原来还有门道。 程序大致是这样的: 运行结果如下: UnboundLocalError
本文向大家介绍Python变量作用范围实例分析,包括了Python变量作用范围实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python变量作用范围。分享给大家供大家参考。具体如下: 希望本文所述对大家的Python程序设计有所帮助。
问题 你想创建类变量和实例变量(属性)。 解决方案 类变量 class Zoo @MAX_ANIMALS: 50 MAX_ZOOKEEPERS: 3 helpfulInfo: => "Zoos may contain a maximum of #{@constructor.MAX_ANIMALS} animals and #{@MAX_ZOOKEEPERS} zoo keep
类变量: 是可在类的所有实例之间共享的值(也就是说,它们不是单独分配给每个实例的)。例如下例中,num_of_instance 就是类变量,用于跟踪存在着多少个Test 的实例。 实例变量: 实例化之后,每个实例单独拥有的变量。 class Test(object): num_of_instance = 0 def __init__(self, name): sel