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

Я довольно плохо знаком с 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 к MyClass, чтобы сделать это? Я знаю, что * args [0] является экземпляром MyClass, но он доступен только при вызове функции.

1 Ответ

3 голосов
/ 16 марта 2009

Невозможно прочитать его из функции внутри декоратора класса, поскольку «методы» все еще являются нормальной функцией, пока класс компилируется. Кроме того, имя класса не было определено во время компиляции.

Что вы можете сделать, это предоставить список my_var декоратору.

class MyClass:
    my_var = []

    @my_decorator(my_var, 'sometext')
    def my_func()
        # do some super cool thing

my_var до сих пор является нормальной переменной.

...