在Python中动态将超类添加到已知类

时间:2018-12-03 12:06:36

标签: python oop

如下定义两个类。

class A:
    pass
class B(A):
    pass

现在,我想将B重新定义为class B(A, C),并动态添加一个新的父类C。这里的“动态”是指我输入一个字符串“ C”,然后输出修改后的类B作为A和C的子类,其中A可以动态引入。

可能存在两种方法,一种是修改B的存储超类信息的属性,另一种是重新定义B,通过这种方法,我们必须了解B的所有超类。

1 个答案:

答案 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]