Python中可否在子类中为超类分配数据属性 该实践是否可取
关于子类初始化时赋值父类
__init__返回值的问题说明 你给出的写法存在根本性的逻辑错误,这种实践完全不被提倡,甚至无法实现你期望的效果,原因如下:
- Python中类的
__init__是初始化方法,仅负责对已创建的实例对象做属性赋值操作,解释器会强制忽略它的返回值,规范要求__init__只能返回None,如果在__init__中主动返回非None值,运行时会直接抛出TypeError。 - 因此你代码中
Super.__init__(self, name)的返回值永远是None,赋值给self.name只会得到空值,完全拿不到你期望的超类返回结果。
对应需求的正确实现方式
场景1:需要子类继承超类的所有属性和方法
这种情况下直接调用超类的初始化方法即可,超类__init__中给self设置的所有属性,子类实例可以直接访问,不需要额外赋值:
class Super: def __init__(self, name): self.name = name self.age = 10 class Sub(Super): def __init__(self, name): # 调用超类初始化逻辑,会自动给当前self实例设置name、age属性 super().__init__(name) # 后续直接访问self.name就可以拿到值 print(self.name)
场景2:需要把超类实例作为子类的一个独立属性(组合模式)
如果不需要完全继承超类的所有能力,仅需要持有超类实例,那就不要用继承,直接在子类初始化时实例化超类赋值给属性即可:
class Super: def __init__(self, name): self.name = name class Sub: def __init__(self, name): # 直接实例化超类,赋值给子类的属性 self.super_instance = Super(name) # 后续通过self.super_instance.name访问对应属性
内容的提问来源于stack exchange,提问作者Yus Ra
相关产品推荐
相关产品推荐

