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