Python继承:基类能否访问派生类的成员?
基类为何能访问派生类的属性/方法?
这个问题问得特别好!我刚接触Python继承的时候也卡过这个点,咱们先把你的示例代码补全(方便大家理解场景),再拆解背后的逻辑:
完整示例代码
class Fish: def color(self): # 这里的self指向的是调用方法的实例,而不是Fish类本身 return self._colour class Goldfish(Fish): def __init__(self): self._colour = "golden" # 测试调用 gf = Goldfish() print(gf.color()) # 输出:golden
核心逻辑:self的本质是「调用方法的实例」
在Python的面向对象中,实例方法的第一个参数self,永远指向的是调用这个方法的具体实例对象,而不是定义该方法的类的实例。
当你执行gf.color()时:
gf是Goldfish的实例,它继承了Fish类的color方法- 调用
color方法时,Python会自动把gf作为self参数传入Fish.color()中 - 此时
self就是Goldfish的实例,它拥有子类定义的_colour属性,所以基类的color方法自然能通过self._colour访问到这个属性
反证:基类实例无法访问子类属性
如果我们直接创建基类Fish的实例并调用color方法,就会报错——因为基类实例本身没有_colour属性:
f = Fish() print(f.color()) # 抛出错误:AttributeError: 'Fish' object has no attribute '_colour'
注意:这种写法不推荐
虽然语法上可行,但基类依赖子类的属性是一种反模式,违反了依赖倒置原则:
- 基类应该是抽象、通用的,不应该依赖子类的具体实现
- 更好的做法是让基类定义必要的属性(比如给个默认值),或者把
color设计成抽象方法,强制子类实现:from abc import ABC, abstractmethod class Fish(ABC): @abstractmethod def color(self): pass class Goldfish(Fish): def color(self): return "golden"
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

