Я не настолько знаком с Python, но из того, что я знаю о метапрограммировании Python, вы могли бы сделать это почти так же, как это делается в Ruby.
В Ruby модуль в основном состоит из двух вещей: указатель на словарь методов и указатель на словарь констант. Класс состоит из трех вещей: указатель на словарь методов, указатель на словарь констант и указатель на суперкласс.
Когда вы смешиваете модуль M
в класс C
, происходит следующее:
- создается анонимный класс
α
(это называется include class )
α
и указатели словаря констант установлены равными M
'*
α
установлен равным C
'*
C
установлен на α
Другими словами: фальшивый класс, который делится своим поведением с миксином, внедряется в иерархию наследования. Таким образом, Ruby на самом деле использует наследование для состава mixin.
Я пропустил пару пунктов выше: во-первых, модуль фактически не вставляется как суперкласс C
, он вставляется как суперклассы C
(то есть C
). синглтон класс) суперкласс. И, во-вторых, если сам миксин смешался с другими миксинами, то эти также будут обернуты в поддельные классы, которые вставляются непосредственно над α
, и этот процесс применяется рекурсивно, в случае, если миксин смешан в включаю миксин.
По сути, вся иерархия миксинов сглаживается в прямую линию и объединяется в цепочку наследования.
AFAIK, Python фактически позволяет вам изменить суперкласс (ы) класса после факта (то, что Ruby делает , а не позволяет вам это сделать), и он также дает вам доступ к dict
класса (опять же, что-то, что невозможно в Ruby), так что вы сможете реализовать это самостоятельно.