python - 将对象转换为超类/仅比较超类的属性
问题描述
我有的:
我有一个由 4 个类组成的类层次结构,它们在链中继承:
- 超A级。
- B推导出A。
- C 导出 B。
- D 导出 C。
每个类都有 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 中解决这个问题?我可以以某种方式更改班级结构以使其成为可能吗?
解决方案
解决此问题的一种方法是将您要使用的身份视为字典的显式键,将该键映射到您的实际对象。
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)
这种方法基本上模仿了您定义每类哈希/等于或比较接口的行为。
推荐阅读
- mysql - 我无法在触发器中执行这两个语句
- java - 如何显示翻转大像素图过程的指示器?
- google-play - 我的 Android 应用未显示在 Play 商店搜索列表中,即使该应用处于已发布状态
- selenium - WebDriverEventListener 截图 onException()
- scala - scala,过滤RDD
- python - Apriori算法的输出是否应该是一对一的关系
- git - 从存储库获取分支依赖
- system - 如何使用 Windows 防火墙阻止进程?
- spring-boot - Jprofiler 不会在应用程序崩溃时分离
- c++ - 我可以使用 cmake/make 编译所有且仅编译我使用的 cpp/hpp 文件吗?