#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
.