如何以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
相关产品推荐
相关产品推荐

