类变量继承

类变量继承

项目上发现一个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))


模板成员变量继承和普通的成员变量继承似的,派生可以直接继承的成员变量,包括模板成员变量。在派生中,可以使用基的成员变量,但不能直接访问基的私有成员变量。需要通过公有或保护的成员函数访问。 例如,我们定义一个基模板: ``` template <typename T> class Base { public: T value; Base(T v) : value(v) {} }; ``` 然后我们定义一个派生模板: ``` template <typename T> class Derived : public Base<T> { public: Derived(T v1, T v2) : Base<T>(v1), another_value(v2) {} T getAnotherValue() const { return another_value; } private: T another_value; }; ``` 在这个例子中,派生 Derived 继承了基 Base 的成员变量 value。在构造函数中,我们通过 Base<T>(v1) 显式地调用基构造函数初始化 value。在派生中,我们还定义了自己的成员变量 another_value,并且通过公有成员函数 getAnotherValue() 访问它。需要注意的是,我们无法直接访问基的私有成员变量 value,需要通过基的公有成员函数或者保护成员函数访问。 在使用派生时,可以像使用基一样使用其成员变量: ``` Derived<int> d(10, 20); cout << d.value << endl; // 输出 10 cout << d.getAnotherValue() << endl; // 输出 20 ``` 在这个例子中,我们创建了一个 Derived 对象 d,并访问了其成员变量 value 和 another_value,以及公有成员函数 getAnotherValue()。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值