类变量继承
项目上发现一个bug。是类变量覆盖的问题,由此记录一下。基类类变量不可用super等方式赋值。注意其是类变量
- 如果该变量在该类中有定义,则使用该值。
- 如果没有,将搜索父类,多继承时采用C3方法,一般不存在交叉的类都是从左到右顺序搜索。搜索过程中如果前面父类的值被重新赋值,则类变量值将改变成该值
class BaseClass(object):
base_info = None
def __init__(self, base_info):
BaseClass.base_info = base_info
class ClassA(BaseClass):
def __init__(self, base_info):
super(ClassA, self).__init__(base_info)
class ClassB(BaseClass):
def __init__(self, base_info):
super(ClassB, self).__init__(base_info)
if __name__ == '__main__':
print 'dir:%s' % dir(BaseClass)
print 'dir:%s' % dir(ClassA)
print 'dir:%s' % dir(ClassB)
print 'mro base:%s \n classA:%s \n classB:%s' % (BaseClass.mro(), ClassA.mro(), ClassB.mro())
print 'BaseClass:%s class_a_info:%s class_b_info:%s' % (BaseClass.base_info, ClassA.base_info, ClassB.base_info)
print 'ID BaseClass:%s class_a_info:%s class_b_info:%s' % (id(BaseClass.base_info), id(ClassA.base_info), id(ClassB.base_info))
class_a = ClassA(1)
print 'BaseClass:%s class_a_info:%s class_b_info:%s' % (BaseClass.base_info, ClassA.base_info, ClassB.base_info)
print 'ID BaseClass:%s class_a_info:%s class_b_info:%s' % (id(BaseClass.base_info), id(ClassA.base_info), id(ClassB.base_info))
class_b = ClassB(2)
print 'BaseClass:%s class_a_info:%s class_b_info:%s' % (BaseClass.base_info, ClassA.base_info, ClassB.base_info)
print 'ID BaseClass:%s class_a_info:%s class_b_info:%s' % (id(BaseClass.base_info), id(ClassA.base_info), id(ClassB.base_info))
使用以上方式修改会修改的是BaseClass的类变量。所以对base_info 执行 id(), 得到的地址是一致的。结果如下:
dir:['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'base_info']
dir:['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'base_info']
dir:['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'base_info']
mro base:[<class '__main__.BaseClass'>, <type 'object'>]
classA:[<class '__main__.ClassA'>, <class '__main__.BaseClass'>, <type 'object'>]
classB:[<class '__main__.ClassB'>, <class '__main__.BaseClass'>, <type 'object'>]
BaseClass:None class_a_info:None class_b_info:None
ID BaseClass:4326135416 class_a_info:4326135416 class_b_info:4326135416
BaseClass:1 class_a_info:1 class_b_info:1
ID BaseClass:140451702124936 class_a_info:140451702124936 class_b_info:140451702124936
BaseClass:2 class_a_info:2 class_b_info:2
ID BaseClass:140451702124912 class_a_info:140451702124912 class_b_info:140451702124912
单独配置变量
在子类继承中设置变量,就变成了子类的类变量。这样就不会共享。如下方式。
class BaseClass(object):
base_info = None
class ClassA(BaseClass):
base_info = 1
class ClassB(BaseClass):
base_info = 2
if __name__ == '__main__':
print 'dir:%s' % dir(BaseClass)
print 'dir:%s' % dir(ClassA)
print 'dir:%s' % dir(ClassB)
print 'mro base:%s \n classA:%s \n classB:%s' % (BaseClass.mro(), ClassA.mro(), ClassB.mro())
print 'BaseClass:%s class_a_info:%s class_b_info:%s' % (BaseClass.base_info, ClassA.base_info, ClassB.base_info)
print 'ID BaseClass:%s class_a_info:%s class_b_info:%s' % (id(BaseClass.base_info), id(ClassA.base_info), id(ClassB.base_info))
# class_a = ClassA(1)
print 'BaseClass:%s class_a_info:%s class_b_info:%s' % (BaseClass.base_info, ClassA.base_info, ClassB.base_info)
print 'ID BaseClass:%s class_a_info:%s class_b_info:%s' % (id(BaseClass.base_info), id(ClassA.base_info), id(ClassB.base_info))
# class_b = ClassB(2)
print 'BaseClass:%s class_a_info:%s class_b_info:%s' % (BaseClass.base_info, ClassA.base_info, ClassB.base_info)
print 'ID BaseClass:%s class_a_info:%s class_b_info:%s' % (id(BaseClass.base_info), id(ClassA.base_info), id(ClassB.base_info))