【发布时间】:2020-02-05 23:08:27
【问题描述】:
我需要找到一组类的最后一个共同祖先,以便返回该类型。
上下文,我正在做一些相当复杂的元编程,涉及重载 numpy 功能。 (不要问)我有一个函数的可变数量的参数,我使用这些信息提取到一个集合中的类型(过滤掉一些不相关的类型)我需要找出最远的类型树其中所有类型共享相同的基本类型。我有一些第一次尝试,但我被多重继承等绊倒了。
第一关:
def lca_type(types):
if len(types) == 1:
return types.pop()
filtered_types = set()
for type in types:
if not any(issubclass(type, x) for x in types):
filtered_types.add(type)
if len(filtered_types) == 1:
return filtered_types.pop()
# TODO: things get tricky here
考虑以下类层次结构:
class A(object):
pass
class B(A):
pass
class C(A):
pass
class D(A):
pass
class B1(B):
pass
class B2(B):
pass
class BC(C, B1):
pass
class CD(C, D):
pass
class D1(D):
pass
class BD(B, D):
pass
class B1_1(B1):
pass
预期结果:
lca_type({A,BD}) == A
lca_type({C}) == C
lca_type({B1,B2}) == B
lca_type({{B1_1, D}) == A
lca_type({CD, BD}) == D
lca_type({B1_1, BC}) == B1
【问题讨论】:
-
可能有一个递归解决方案。我同意多重继承会使它复杂化,你需要做一个 BFS 来沿着任何分支找到 MRCA。
-
@barmer 我认为这是真的。
标签: python oop inheritance types casting