class Class_1():
def __init__(self):
self.var_1 = '父属性' # *
self.var_2 = '父属性'
self.fun_1() # 第一次输出
def fun_1(self):
print('父方法')
print(self.var_1)
print(self.var_2)
class Class_2(Class_1):
def __init__(self):
super().__init__() # 调用父类的构造方法
self.var_1 = '子属性'
self.fun_1() # 第二次输出
self.var_2 = '子属性'
def fun_1(self):
print('子方法')
print(self.var_1) # *如果置于实例方法之后,会引发错误 AttributeError: 'Class_2' object has no attribute 'var_1'
print(self.var_2)
obj_test = Class_2()
print(r'''===解释===
子方法 调用子类的构造方法(11),调用父类的构造方法(12),调用行(3-5),同名实例方法被子类(16)覆盖
父属性 引用行(3)
父属性 引用行(4)
子方法 调用行(13),调用实例方法(14),其中同名实例属性被子类(13)覆盖,调用行(15)
子属性 引用行(13)
父属性 引用行(4)
==========''')
结论
同名实例函数被覆盖
实例变量则根据实际运行顺序而定