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?

Foi útil?

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 sua im_self atributo é o exemplo, e o método de objeto é dito ser vinculado.Em qualquer caso, o novo método im_class atributo é a classe de que a recuperação ocorre, e o seu im_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__, e im_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)

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