首页 > 解决方案 > 将对象转换为超类/仅比较超类的属性

问题描述

我有的:

我有一个由 4 个类组成的类层次结构,它们在链中继承:

每个类都有 1 个(额外的)属性。所以A有1个属性,D有4个属性:

class A:
    def __init__(self, a):
        self.a = a

class B(A):
    def __init__(self, a, b):
        super().__init__(a)
        self.b = b

class C(B):
    def __init__(self, a, b, c):
        super().__init__(a, b)
        self.c = c

class D(C):
    def __init__(self, a, b, c, d):
        super().__init__(a, b, c)
        self.d = d

我想做的事:

我有 2 组 D 类对象。我想计算 2 组的交集。之后,我想得到 2 个集合的其余部分的交集(第一个交集中没有项目的集合),但是这次比较它们,因为它们是 C 类的对象集(所以只比较 4 个中的 3 个属性)。等等...

解决方案?

在 Java 中,我可以计算 2 个集合的交集,然后将集合的余数转换为 C 类的对象,然后再次计算 2 个集合的交集,仅比较 4 个属性中的 3 个。Afaik,没有像这个 python 这样的类型转换。(不正确,如评论中所述。)

如何在 python 中解决这个问题?我可以以某种方式更改班级结构以使其成为可能吗?

标签: pythoninheritance

解决方案


解决此问题的一种方法是将您要使用的身份视为字典的显式键,将该键映射到您的实际对象。

class A:
    def __init__(self, a):
        self.a = a

class B(A):
    def __init__(self, a, b):
        super().__init__(a)
        self.b = b

class C(B):
    def __init__(self, a, b, c):
        super().__init__(a, b)
        self.c = c

class D(C):
    def __init__(self, a, b, c, d):
        super().__init__(a, b, c)
        self.d = d


def d_key(item):
    return item.a, item.b, item.c, item.d


def c_key(item):
    return item.a, item.b, item.c



a = [D(1, 2, 3, 4), D(1, 3, 2, 4), D(1, 2, 4, 3), D(2, 1, 3, 4)]
b = [D(1, 2, 3, 4), D(1, 3, 2, 4), D(1, 2, 4, 3), D(2, 1, 3, 5)]


ad = dict((d_key(item), item) for item in a)
bd = dict((d_key(item), item) for item in b)

common = ad.keys() & bd.keys()

ac = dict((c_key(item), item) for item in a if d_key(item) in common)
bc = dict((c_key(item), item) for item in b if d_key(item) in common)

print(ac)
print(bc)

这种方法基本上模仿了您定义每类哈希/等于或比较接口的行为。


推荐阅读