Python中的类变量在子父类中被修改时引起的变化

来源:互联网 发布:linux vi命令日志 编辑:程序博客网 时间:2024/05/18 01:54

运行结果是:



# -*- coding: utf-8 -*-"""Created on Thu Dec  7 20:29:58 2017@author: Administrator"""class  Parent( object):    x = 1    class Child1( Parent):    passclass Child2( Parent):    passprint ( Parent.x , Child1.x , Child2.x)Child1.x = 2print( Parent.x , Child1.x, Child2.x)Parent.x = 3print( Parent.x, Child1.x, Child2.x)

为什么最后一行的输出是 3 23 而不是 3 2 1 ?

       为什么改变了Parent.x 的值还会改变 Child2.x 的值,但是同时Child1.x 值却没有改变?

       这个答案的关键是,在Python 中,类变量在内部是作为字典处理的。如果一个变量的名字没有在当前类的字典中发现,将搜索祖先类(比如父类)直到被引用的变量名被找到(如果这个被引用的变量名既没有在自己所在的类又没有在祖先类中找到,会引发一个AttributeError 异常)。

       因此,在父类中设置x = 1 会使得类变量 x 在引用该类和其任何子类中的值为 1 。这就是因为第一个 print 语句的输出是 1 1 1。

随后,如果任何它的子类重写了该值(例如,我们执行语句 Child1.x = 2 ),然后,该值仅仅在子类中被改变。这就是为什么第二个 print语句的输出是 1 2 1 。

       最后,如果该值在父类中被改变(例如,我们执行语句Parent.x = 3 ),这个改变会影响到任何未重写该值的子类当中的值(在这个示例中被影响的子类是 Child2 )。这就是为什么第三个 print 输出是 3 2 3 。


阅读全文
0 0
原创粉丝点击