如下定义两个类。
class A:
pass
class B(A):
pass
现在,我想将B重新定义为class B(A, C)
,并动态添加一个新的父类C
。这里的“动态”是指我输入一个字符串“ C”,然后输出修改后的类B作为A和C的子类,其中A可以动态引入。
可能存在两种方法,一种是修改B的存储超类信息的属性,另一种是重新定义B,通过这种方法,我们必须了解B的所有超类。
答案 0 :(得分:1)
这种元编程在Python中通常很简单。我认为您可以避免以下问题,如果您不介意简单地重新定义B,我相信您可以使用type
构造函数和mro
方法动态地重新构造该类,给出方法解析顺序:
In [1]: class A:
...: pass
...: class B(A):
...: pass
...: class C:
...: foo = 42
...:
...: B = type('B', (*B.mro()[:-1], C), dict(vars(B)))
...:
...:
注意
In [2]: isinstance(B(), A), isinstance(B(), C)
Out[2]: (True, True)
In [3]: B.foo
Out[3]: 42
我将其切成薄片以避免object
仍然仍然隐式地表现。
In [6]: B.mro()
Out[6]: [__main__.B, __main__.B, __main__.A, __main__.C, object]
In [7]: B.mro()[:-1]
Out[7]: [__main__.B, __main__.B, __main__.A, __main__.C]