Em Python, é possível acessar a classe que contém um método, dado apenas um objeto método?

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

  •  19-08-2019
  •  | 
  •  

Pergunta

Eu sou muito novo para Python, e não ter sido capaz de encontrar uma resposta para esta pergunta de pesquisa on-line.

Aqui está um exemplo decorador que não faz nada (ainda)

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

Aqui está um exemplo de classe

class MyClass:
  my_var = []

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

Na minha decorador eu gostaria de acessar o objeto de classe para MyClass e adicionar em 'sometext' à lista MyClass.my_var. Meu objetivo é my_var populate com os valores decorados em carga módulo tempo, não o tempo chamada de função.

Existe uma maneira que eu possa navegar de f para MyClass, a fim de fazer isso? Eu sei que args * [0] é a instância de MyClass, mas que só está disponível quando a função é chamada.

Foi útil?

Solução

Não é possível lê-lo a partir de uma função dentro de um decorador de classe, uma vez que os "métodos" são ainda função normal enquanto a classe está sendo compilado. Além disso, o nome da classe não foi definido enquanto ele está sendo compilado.

O que você poderia fazer é fornecer a lista my_var para o decorador.

class MyClass:
    my_var = []

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

my_var ainda é uma variável normal até então.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top