You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.10中如何从子类对象获取父类对象?

问题:从子类对象中获取父类对象的正确方式

我有父类和子类,想要从子类对象中获取父类对象。代码如下:

class A:
    def __init__(self, property1):
        self.property1 = property1

class B(A):
    def __init__(self, property1, property2):
        super().__init__(property1)
        self.property2 = property2
        
    def get_parent(self):
        return super()

b = B(property1="Value1", property2="Value2")
parent = b.get_parent()
print(parent.property1)

运行后出现错误:AttributeError: 'super' object has no attribute 'property1'

请问该如何解决此问题?


编辑补充

class A:
    def __init__(self, property1):
        self.property1 = property1
        
    def get_A(self):
        return self
        
    def get_A2(self):
        return A(self.property1)
    
class B(A):
    def __init__(self, property1, property2):
        super().__init__(property1)
        self.property2 = property2
        
b = B(property1="Value1", property2="Value2")

# 期望的方式但无效
parent = b.get_A()
print(type(parent))
print(parent.property1)
print(parent.property2)

# 可行但需重新调用A的构造函数
parent = b.get_A2()
print(type(parent))
print(parent.property1)
print(parent.property2)

运行结果:

<class '__main__.B'>
Value1
Value2
<class '__main__.A'>
Value1

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[77], line 27
     25 print(type(parent))
     26 print(parent.property1)
---&gt; 27 print(parent.property2)

AttributeError: 'A' object has no attribute 'property2'

返回的类型仍是B而非A...如何避免必须通过构造函数从B重新创建A?


解答

核心问题说明

Python中不存在依附于子类实例的「独立父类对象」,子类实例本身就包含了父类的属性和方法,它本质上是子类类型的实例。你之前用super()报错,是因为super()返回的是一个父类方法代理对象,不是父类实例,无法直接访问实例属性。

具体解决方案

  1. 仅需访问父类属性/方法:直接用子类实例
    子类实例继承了父类的所有属性,不需要额外获取「父类对象」,直接访问即可:

    b = B("Value1", "Value2")
    print(b.property1)  # 直接访问父类继承的属性,完全有效
    
  2. 需要独立的父类A实例:复用属性创建新实例
    如果确实需要一个独立的A类型实例,又不想重新编写构造逻辑,可以复用子类实例中已有的父类属性值来创建:

    class B(A):
        def __init__(self, property1, property2):
            super().__init__(property1)
            self.property2 = property2
        
        def get_parent_instance(self):
            # 复用当前实例的父类属性创建新的A实例
            parent = A(self.property1)
            # 若A有多个属性,可批量复制(过滤私有属性)
            # for attr in dir(A):
            #     if not attr.startswith('_') and hasattr(self, attr):
            #         setattr(parent, attr, getattr(self, attr))
            return parent
    

    这种方式得到的是独立的A实例,不会包含子类的属性(如property2),且无需重复执行构造逻辑。

  3. 为什么get_A返回B类型?
    在Python中,self始终指向当前创建的对象实例。子类B的实例调用父类A的get_A方法时,self还是B类型的实例,所以返回self必然是B类型,这是Python的对象绑定机制决定的,无法改变。

总结

  • 若只是使用父类的属性或方法,直接用子类实例即可,无需额外操作
  • 必须要独立的A实例时,只能通过复制现有属性的方式创建,无法从子类实例中「提取」出一个已存在的父类实例——因为子类实例本身是一个完整对象,父类属性是它的一部分,而非独立对象。

内容的提问来源于stack exchange,提问作者hotips

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:17:42