Como saber se um python método é dependente ou não?
-
09-06-2019 - |
Pergunta
Dada uma referência para um método, existe uma forma de verificar se o método está vinculado a um objeto ou não?Você pode também acessar a instância que ele é obrigado a?
Solução
def isbound(method):
return method.im_self is not None
def instance(bounded_method):
return bounded_method.im_self
Os métodos definidos pelo usuário:
Quando um usuário definido pelo método do objeto é criado através da obtenção de um definido pelo usuário função de objeto a partir de uma classe
im_self
atributo éNone
e o método de objeto é dito ser independente.Quando é criado através da obtenção de um função definida pelo usuário a partir de um objeto classe através de uma das suas instâncias, a suaim_self
atributo é o exemplo, e o método de objeto é dito ser vinculado.Em qualquer caso, o novo métodoim_class
atributo é a classe de que a recuperação ocorre, e o seuim_func
atributo é o original objeto de função.
Em Python 2.6 e 3.0:
Método de instância de objetos tem de novo atributos para o objeto e função compreendendo o método;o novo sinônimo para
im_self
é__self__
, eim_func
também está disponível como__func__
.O velho os nomes ainda são suportadas no Python 2.6, mas desapareceram no 3.0.
Outras dicas
No python 3 a __self__
atributo é apenas conjunto em métodos de limite.Não definido None
em funções simples (ou independente métodos, que são apenas funções simples em python 3).
Usar algo como isto:
def is_bound(m):
return hasattr(m, '__self__')
O escolhido resposta é válida em quase todos os casos.No entanto, quando a verificação se um método está vinculado em um decorador escolhida resposta, a verificação falha.Considere este exemplo decorador e método:
def my_decorator(*decorator_args, **decorator_kwargs):
def decorate(f):
print(hasattr(f, '__self__'))
@wraps(f)
def wrap(*args, **kwargs):
return f(*args, **kwargs)
return wrap
return decorate
class test_class(object):
@my_decorator()
def test_method(self, *some_params):
pass
O print
instrução decorador vai imprimir False
.Neste caso eu não posso encontrar qualquer outro caminho, mas a função de verificação de parâmetros usando o argumento de nomes e procure por um nome self
.Este é também não é garantida para funcionar perfeitamente porque o primeiro argumento de um método, não é obrigado a ser chamado self
e pode ter qualquer outro nome.
import inspect
def is_bounded(function):
params = inspect.signature(function).parameters
return params.get('self', None) is not None
im_self atributo (somente Python 2)