Этот вид метапрограммирования обычно довольно прост в 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]