python - 在 Python 中动态地将超类添加到已知类
问题描述
定义两个类如下。
class A:
pass
class B(A):
pass
现在,我想将 B 重新定义为class B(A, C)
,动态添加一个新的父类C
。这里“动态”意味着我输入一个字符串'C',然后输出修改后的B类作为A和C的子类,其中A可以动态引入。
可能有两种方法,一种是修改B的存储超类信息的属性,另一种是重新定义B,通过它我们必须知道B的所有超类。
解决方案
这种元编程在 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]
推荐阅读
- xamarin.forms - Xamarin.Forms 4:未调用 ContentPage 的 OnBackButtonPressed
- c++ - c++连接mysql失败
- jquery - Jquery Datatable不使用MVC显示
- javascript - 从 www.google.com/recaptcha/api/siteverify 获取响应的问题
- python - 如何将 pandas DataFrame 压缩到具有唯一键和列出值的字典中?
- android - 应用程序上的 react-native run-android 时构建错误,没有任何变化
- python - Kivy ScreenManager 不切换屏幕(纯python)
- javascript - 扩展 GraphQL 过滤器定义
- animation - 不能使移动的容器逐渐变大并且从屏幕中心开始在颤动中变小
- android - Android:Makefile.modbuiltin 中的 $(obj) 变量是什么?