如何在子类__init__函数外部用子类对象初始化父类
问题:如何在子类__init__外部用子类对象初始化父类?
先看两个基础类的定义:
class A: def __init__(self) -> None: pass class B(A): def __init__(self) -> None: print(self) A.__init__(self)
初始化B类实例时,传递给A的self是B类的实例:
a = A() b = B() # 输出:<__main__.B object at 0x0000021CC0E39700>
打印b能确认它是B类实例,但在B类外部直接用B实例调用A(b)会报错:
print(b) A(b) # 输出错误:TypeError: __init__() takes 1 positional argument but 2 were given
另外,调用A.__init__(b)时,返回值a为None:
b = B() a = A.__init__(b) # a的值是None
请问如何实现在子类__init__函数外部用子类对象初始化父类?
解决方案
1. 直接调用父类__init__方法处理子类实例
A(b)报错的原因是:A()创建实例时会自动把新生成的A实例作为self参数传入__init__,再额外传b就变成两个参数,超出了A.__init__的参数要求。
而A.__init__(b)本身是初始化方法,它的作用是对传入的实例(这里是B类的b)执行父类的初始化逻辑,这个方法没有返回值,所以赋值得到None是正常的。如果你的需求是让子类实例应用父类的初始化逻辑,直接调用即可:
b = B() # 用父类的初始化逻辑处理子类实例b A.__init__(b)
2. 创建新的父类实例并复用子类实例的数据
如果你的需求是生成一个父类A的实例,并用子类B实例的属性来初始化它,需要给A添加一个支持从子类实例创建的方法,比如类方法:
class A: def __init__(self) -> None: self.attr = 0 # 示例属性 @classmethod def from_child(cls, child_inst): # 创建A的新实例 a = cls() # 复制子类实例的属性到父类实例(根据实际需求调整) if hasattr(child_inst, 'attr'): a.attr = child_inst.attr return a class B(A): def __init__(self) -> None: super().__init__() self.attr = 100 # 子类自定义属性值 # 使用子类实例创建父类实例 b = B() a = A.from_child(b) print(a.attr) # 输出:100 print(type(a)) # 输出:<class '__main__.A'>
内容的提问来源于stack exchange,提问作者Pier-Olivier Marquis
相关产品推荐
相关产品推荐

