В Python, возможно ли получить доступ к классу, который содержит метод, учитывая только объект метода?
Вопрос
Я довольно новичок в Python и не смог найти ответ на этот вопрос из поиска в Интернете.
Вот пример декоратора, который ничего не делает (пока)
def my_decorator(text):
def wrap(f):
# grab magic f.parent_class_object.my_var and append text
def wrap_f(*args, **kwargs):
f(*args, **kwargs)
return wrap_f
return wrap
Вот пример класса
class MyClass:
my_var = []
@my_decorator('sometext')
def my_func()
# do some super cool thing
В моем декораторе я хотел бы получить доступ к объекту класса для MyClass
и добавить «sometext» в список MyClass.my_var
. Моя цель - заполнить my_var декорированными значениями во время загрузки модуля , а не во время вызова функции.
Есть ли способ, с помощью которого я могу перейти от f
к <=>, чтобы сделать это? Я знаю, что * args [0] является экземпляром MyClass, но он доступен только при вызове функции.
Решение
Невозможно прочитать его из функции внутри декоратора класса, так как " method " все еще нормальная функция, пока класс компилируется. Кроме того, имя класса не было определено во время компиляции.
Что вы можете сделать, это предоставить список my_var
декоратору.
class MyClass:
my_var = []
@my_decorator(my_var, 'sometext')
def my_func()
# do some super cool thing
<=> к тому времени все еще является нормальной переменной.