В Python, возможно ли получить доступ к классу, который содержит метод, учитывая только объект метода?

StackOverflow https://stackoverflow.com/questions/649329

  •  19-08-2019
  •  | 
  •  

Вопрос

Я довольно новичок в 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

<=> к тому времени все еще является нормальной переменной.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top