Python 如何比较具有相同继承的@dataclass的实例子类
我试图比较两个从公共基类(也是@dataclass)继承的数据类 继承类的字段是特定于它们的,在比较中不考虑这些字段;我只想比较基类属性 以下是我的尝试:Python 如何比较具有相同继承的@dataclass的实例子类,python,python-3.x,python-dataclasses,Python,Python 3.x,Python Dataclasses,我试图比较两个从公共基类(也是@dataclass)继承的数据类 继承类的字段是特定于它们的,在比较中不考虑这些字段;我只想比较基类属性 以下是我的尝试: 从数据类导入数据类,字段 @数据类(顺序=真) 类库: a:浮动 @数据类(顺序=真) ChildA类(基本类): 属性a:str=field(比较=False) @数据类(顺序=真) B类(基本): 属性b:str=field(比较=False) ca=ChildA(1,‘a’) cb=ChildB(2,'b') ca
从数据类导入数据类,字段
@数据类(顺序=真)
类库:
a:浮动
@数据类(顺序=真)
ChildA类(基本类):
属性a:str=field(比较=False)
@数据类(顺序=真)
B类(基本):
属性b:str=field(比较=False)
ca=ChildA(1,‘a’)
cb=ChildB(2,'b')
ca
然而,我得到:
TypeError: '<' not supported between instances of 'ChildA' and 'ChildB'
TypeError:“ca.a
两者都具有父类中的属性“a”,使用“.a”访问该属性您应该自己定义Base
的比较方法;dataclass
创建的方法要求参数具有完全相同的类型
from functools import total_ordering
@total_ordering
@dataclass(eq=False)
class Base:
a: float
# Both of these are oversimplified. At the very
# least, handle the error resulting from `other`
# not having an `a` attribute.
def __eq__(self, other):
return self.a == other.a
def __lt__(self, other):
return self.a < other.a
从functools导入总排序
@总订单
@数据类(eq=False)
类库:
a:浮动
#这两个问题都过于简单化了。至少
#至少要处理由“其他”导致的错误`
#没有'a'属性。
定义(自身、其他):
返回self.a==其他.a
定义(自身、其他):
返回自我a
生成的比较方法始终要求参数具有完全相同的类型;无法比较共同祖先的单独子类。看见您必须自己定义Base.\uu lt\uuuuuuuuuuu
等(尽管请参阅functools.total\u ordering
,只需要\uuuuuueq\uuuuuuuuuuuuuuuu>和一个其他方法来生成其余的参数,使之更简单)。>“生成的比较方法总是要求参数具有完全相同的类型。”即使我设置了字段(compare=False),这也是真的吗?在比较方法中不应该丢弃这些字段吗?这是一个简化的示例,只有一个可比较的属性。如果我有更复杂的数据类和更多的属性呢?当然,我仍然可以将它们分组为一个元组(例如,(ca.a,ca.b,ca.c)
),但我想知道是否有更直接的方法?哦,我明白了,我会把这个问题添加到书签中,稍后再讨论,谢谢。但是,由于我正在使用字段(compare=False)
设置子类中的字段,在比较过程中不应该丢弃这些不同的类型吗?根据,在调用\u cmp\u fn
之前,是否应该过滤掉这些属性?否。甚至在查看字段之前,都会比较每个参数的\uu class\uuu
属性的对象标识值。只有在确认两者都是,比如说,ChildA
实例之后,它才会比较所选的属性值。我明白了。谢谢你。这超出了这个问题的范围,但是您认为值得打开一个特性请求/bug,以便在对象标识检查中支持子类吗?