Python在子类中修改父类的类属性(变量)


class Parent:
    class_var = "class_var ori"
    def __init__(self):
        self.p_ins_var = "p_ins_var ori"
 

class Child(Parent):
    def __init__(self): # 实例化对象自动调用的构造函数
        super().__init__()  # 调用父类构造函数,继承了父类的类变量、实例变量,作为实例变量

    def printvar(self):
        print(f" Parent类变量: {Parent.class_var}")  # 父类的类变量
        print(f" self.class_var: {self.class_var}")  # 实例变量
        print(f" self.p_ins_var: {self.p_ins_var}")  # 父类的实例变量
    
    def chgSelfVar(self):
        # 用 self.变量 的方式会创建实例变量,不会改变父类的变量,
        self.class_var = "self classvar new!" 

    def chgClassVar(self):
    ### 用 类名.变量 的方式修改父类的类变量
        Parent.class_var = "Parent var new!" 

 
print("创建Child类的实例:")
cc = Child()
# 构造实例时调用super().__init__()才使cc有 p_ins_var 变量,否则会报错。
# 此时 cc.class_var 指向Parent类的类变量class_var, 还不是cc实例的实例变量。
cc.printvar() 

print("改变Parent类的类变量:")
cc.chgClassVar()  
# 此时改变Parent类的类变量class_var, cc.class_var的值就一样改变
cc.printvar() 


print("运行 cc.class_var = **:")
cc.class_var = "class_var new 333" 
# 对cc实例变量赋值,原先没有这个实例变量就建立一个。现在Parent类的类变量class_var和cc.class_var是不同变量了。
cc.printvar()

print("改变Parent类的类变量:")
Parent.class_var = "Parent var new333" 
# 此时改变Parent类的类变量class_var, cc.class_var的值不再改变了
cc.printvar() 

print("改变self.class_var:")
cc.chgSelfVar()  
# 此时改变cc.class_var的值更不会影响到Parent类的类变量class_var
cc.printvar()

运行结果:

创建Child类的实例:
 Parent类变量: class_var ori
 self.class_var: class_var ori
 self.p_ins_var: p_ins_var ori
改变Parent类的类变量:
 Parent类变量: Parent var new!
 self.class_var: Parent var new!
 self.p_ins_var: p_ins_var ori
运行 cc.class_var = **:
 Parent类变量: Parent var new!
 self.class_var: class_var new 333
 self.p_ins_var: p_ins_var ori
改变Parent类的类变量:
 Parent类变量: Parent var new333
 self.class_var: class_var new 333
 self.p_ins_var: p_ins_var ori
改变self.class_var:
 Parent类变量: Parent var new333
 self.class_var: self classvar new!
 self.p_ins_var: p_ins_var ori

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值