Динамически добавлять суперкласс в известный класс в Python - PullRequest
0 голосов
/ 03 декабря 2018

Определите два класса следующим образом.

class A:
    pass
class B(A):
    pass

Теперь я хочу переопределить B как class B(A, C), добавив новый родительский класс C динамически.Здесь «динамически» означает, что я ввожу строку «C», затем выводю измененный класс B в качестве подкласса A и C, где A может быть введен динамически.

Может существовать два метода, один из которых заключается в изменениисвойство B, в котором хранится информация о суперклассах, другое - переопределить B, с помощью которого мы должны знать все суперклассы B.

1 Ответ

0 голосов
/ 05 декабря 2018

Этот вид метапрограммирования обычно довольно прост в 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...