如何在子类中调用父类方法并让其使用自身实例变量
解决Python子类调用父类方法时使用父类自身实例变量的问题
这个问题的核心在于:当你在子类中通过super()调用父类方法时,方法里的self仍然指向子类的实例,所以父类方法会访问子类实例上已经被覆盖的属性(也就是你设置的where='child')。要让父类方法使用自己的实例变量,我们可以通过两种直观的方式实现:
方法一:直接创建父类实例调用方法
最简单的思路是在子类中显式创建一个父类的独立实例,调用它的show()方法——这样父类方法自然会使用自己实例的where变量,完全不受子类属性的影响:
class Parent(): def __init__(self): self.where = 'parent' def show(self): print("Inside Parent", self.where) class Child(Parent): def __init__(self): self.where = 'child' # 创建父类实例并调用show,此时使用父类自身的where值 Parent().show() self.show() def show(self): print("Inside Child", self.where) # Driver's code obj = Child()
运行这段代码会输出:
Inside Parent parent Inside Child child
方法二:先初始化父类属性,临时切换属性值调用父类方法
如果你不想额外创建父类实例,可以先让父类完成自身属性的初始化,保存父类的属性值后再设置子类的属性,调用父类方法时临时切换回父类的属性值:
class Parent(): def __init__(self): self.where = 'parent' def show(self): print("Inside Parent", self.where) class Child(Parent): def __init__(self): # 先调用父类初始化,得到父类的where值 super().__init__() parent_where = self.where # 设置子类自己的where属性 self.where = 'child' # 临时切换回父类的where,调用父类show方法 self.where = parent_where super().show() # 切回子类的where,调用自己的show方法 self.where = 'child' self.show() def show(self): print("Inside Child", self.where) # Driver's code obj = Child()
这种方式同样能得到你想要的输出,适合需要复用父类实例其他属性的场景。
原代码不符合预期的原因
再补充下原代码的问题:你在子类__init__中先给self.where='child',此时self是子类实例,之后调用super(Child, self).show()时,父类的show方法访问的是子类实例上已经被覆盖的where属性,所以才会输出Inside Parent, child。
内容的提问来源于stack exchange,提问作者Mr. Sigma.
相关产品推荐
相关产品推荐

