首页 > 解决方案 > 在 Python 中动态地将超类添加到已知类

问题描述

定义两个类如下。

class A:
    pass
class B(A):
    pass

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

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

标签: pythonoop

解决方案


这种元编程在 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]

推荐阅读