Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何比较具有相同继承的@dataclass的实例子类_Python_Python 3.x_Python Dataclasses - Fatal编程技术网

Python 如何比较具有相同继承的@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

我试图比较两个从公共基类(也是@dataclass)继承的数据类

继承类的字段是特定于它们的,在比较中不考虑这些字段;我只想比较基类属性

以下是我的尝试:

从数据类导入数据类,字段
@数据类(顺序=真)
类库:
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,以便在对象标识检查中支持子类吗?