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

如何以Pythonic方式确定属性所属的定义父类

Python Dataclass 属性定义类的溯源方案

针对你提出的需求,利用dataclass自带的__dataclass_fields__属性可以实现更简洁Pythonic的属性溯源,无需手动遍历__mro__做复杂判断:

核心实现思路

每个dataclass类都会自动生成__dataclass_fields__字典,其中仅包含当前类自身定义的字段,父类的字段不会被包含进来。结合类的方法解析顺序(__mro__),从对象的类开始向上遍历,第一个包含目标属性的类就是该属性的定义类。

代码示例

from dataclasses import dataclass, is_dataclass

def find_attr_owner(obj, attr_name):
    if not is_dataclass(obj):
        raise ValueError("仅支持dataclass实例")
    
    # 按MRO顺序从子类到父类遍历
    for cls in type(obj).__mro__:
        if is_dataclass(cls) and attr_name in cls.__dataclass_fields__:
            return cls
    return None  # 属性未找到时返回None

# 测试你的示例
@dataclass
class Parent():
    p: int = 42

@dataclass
class Child(Parent):
    c: int = 0

obj = Child()
print(find_attr_owner(obj, "p"))  # 输出 <class '__main__.Parent'>
print(find_attr_owner(obj, "c"))  # 输出 <class '__main__.Child'>

适配你的业务场景

对于电力网络描述类的层级结构(如Equipment→ConductingEquipment→Cable),使用这个函数可以快速定位属性的定义类:

  • 传入Cable实例和"name",返回Equipment类
  • 传入Cable实例和"resistance",返回ConductingEquipment类
  • 传入Cable实例和"material",返回Cable类

这种方案直接利用dataclass的内置特性,代码更简洁易读,也符合Python的设计哲学。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:07:20