python类继承中类变量


python类变量

在写python类方法的时候,为了便于方法之间的调用传参,常常定义类变量。类变量和实例变量的不同体现在实例变量只能实例化对象后才能调用,而类变量可以直接使用类名调用

类变量的继承



class Father:
    params = [1, 2, 3]

    @classmethod
    def some_method(cls):
        return 123

    @classmethod
    def set_default(cls):
        cls.params = []

    @classmethod
    def run(cls):
        num = cls.some_method()
        cls.params.append(num)
        cls.set_default()


class Son(Father):
    pass


class Son2(Father):
    pass


Son.run()
sp = Son.params
s2p = Son2.params
fp = Father.params 

上面定义了三个类,其中Son类和Son2类都继承Father类。那么请问,sp、s2p和fp分别是多少?

正确答案是:


sp=[]
s2p=[1,2,3,123]
fp=[1,2,3,123] 

可能有些人会疑惑了,在Son.run()的时候不是已经把cls.params设为空列表了吗?怎么Father类的params不仅没变成空数组,反而多了个"123"元素?

解答

这个问题的出现是当子类添加元素的时候,子类是在父类的内存地址上做的更改,所以添加的元素会自动同步到父类上;但在Son方法中调用cls.params=[],内存中会重新声明一个空列表内存地址,并且python会把Son类的内存地址从父类的内存地址上指向新生成的内存地址上。这样就出现了上述的现象。