Как ссылаться на присоединенный класс из его mixin?

#python #python-3.x #mixins

#python #python-3.x #mixins

Вопрос:

У меня есть следующий класс mixin и класс host, структурированный следующим образом:

 class MyMixin:
    @staticmethod
    def preprocessIncomings(bliss, mod, **kw):
        my_logger(f"{__class__} is doing it's job now!")
        ....

class MyAttachedClass(MyMixin):
    ...
 

К моему удивлению, регистратор не ссылается на MyAttachedClass то, как я предполагал. Вместо этого он ссылается на класс mixin MyMixin .

Есть ли способ ссылаться на класс хоста из статического метода mixin?

Комментарии:

1. Если методу нужен доступ к классу, почему он статичен?

2. весь смысл a staticmethod в том, что у него нет доступа ни к экземпляру, ни к состоянию класса. __class__ это специальная, лексически ограниченная переменная закрытия, вставляемая компилятором, она всегда ссылается на __class__ то, где определена функция, для которой она предназначена super . Если вы хотите получить доступ к классу, в котором используется метод, используйте обычный метод экземпляра или classmethod

Ответ №1:

Подводя итог хорошим моментам в комментариях: нет, a staticmethod специально разработан, чтобы не предоставлять вам доступ к экземпляру или классу, из которого он вызывается, поэтому изнутри невозможно узнать preprocessIncomings , что он был вызван через MyAttachedClass . Это __class__ локальная переменная, которую вы можете рассматривать как замыкание (т. Е. Она получена из внешней области, в которой определен код).

Возможно, вы могли бы сделать больше inspect.stack , но гораздо более очевидным решением является изменение метода на a classmethod .