类变量继承

类变量继承

项目上发现一个bug。是类变量覆盖的问题,由此记录一下。基类类变量不可用super等方式赋值。注意其是类变量

  1. 如果该变量在该类中有定义,则使用该值。
  2. 如果没有,将搜索父类,多继承时采用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))


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值