【发布时间】:2020-10-22 13:08:54
【问题描述】:
我正在尝试比较从公共基类(也是@dataclass)继承的两个数据类。
继承类的字段是特定于它们的,在比较中不考虑;我只想比较基类属性。
这是我的尝试:
from dataclasses import dataclass, field
@dataclass(order=True)
class Base:
a: float
@dataclass(order=True)
class ChildA(Base):
attribute_a: str = field(compare=False)
@dataclass(order=True)
class ChildB(Base):
attribute_b: str = field(compare=False)
ca = ChildA(1, 'a')
cb = ChildB(2, 'b')
ca < cb
但是,我得到:
TypeError: '<' not supported between instances of 'ChildA' and 'ChildB'
我该如何解决这个问题?
【问题讨论】:
-
生成的比较方法总是要求参数具有完全相同的类型;无法比较共同祖先的不同子类。见github.com/python/cpython/blob/3.9/Lib/dataclasses.py#L575。您必须自己定义
Base.__lt__等(尽管请参阅functools.total_ordering以使这更容易,只需要__eq__和另一种方法来生成其余部分)。 -
> "生成的比较方法总是要求参数具有完全相同的类型" 即使我设置了 field(compare=False) 也是如此吗?在比较方法中这些字段不应该被丢弃吗?
标签: python python-3.x python-dataclasses