Question

Donné une référence à une méthode, est-il un moyen de vérifier si la méthode est liée à un objet ou pas?Vous pouvez également accéder à l'instance que c'est lié?

Était-ce utile?

La solution

def isbound(method):
    return method.im_self is not None

def instance(bounded_method):
    return bounded_method.im_self

Méthodes définies par l'utilisateur:

Lorsqu'un utilisateur défini par la méthode de l'objet est créé par la récupération d'un définis par l'utilisateur la fonction de l'objet à partir d'une classe, son im_self l'attribut est None et la méthode objet est dit pour être indépendant.Lorsque l'on est créé par la récupération d'un fonction définie par l'utilisateur à partir d'un objet classe via une de ses instances, ses im_self attribut de l'instance, et la méthode objet est dit d'être lié.Dans les deux cas, la nouvelle méthode de im_class l'attribut est la classe dont la récupération a lieu, et son im_func l'attribut est à l'origine la fonction de l'objet.

En Python 2.6 et 3.0:

Méthode d'Instance, les objets ont de nouvelles les attributs de l'objet et de la fonction composé de la méthode;le nouveau synonyme pour im_self est __self__, et im_func est également disponible en __func__.Le vieux les noms sont toujours pris en charge en Python 2.6, mais ont disparu dans la version 3.0.

Autres conseils

En python 3 __self__ l'attribut est seulement situé sur les méthodes liées.Ce n'est pas définie à None sur la plaine de fonctions (ou indépendant méthodes, qui sont tout simplement les fonctions en python 3).

Utiliser quelque chose comme ceci:

def is_bound(m):
    return hasattr(m, '__self__')

La réponse choisie est valable dans presque tous les cas.Cependant lors de la vérification si une méthode est liée dans un décorateur, à l'aide de la réponse choisie, la vérification échoue.Considérons cet exemple décorateur et méthode:

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

L' print déclaration décorateur va imprimer False.Dans ce cas, je ne peux pas trouver un autre moyen, mais à vérifier en fonction des paramètres à l'aide de leurs noms d'argument et de chercher un nommé self.C'est aussi pas garantis pour un fonctionnement optimal, car le premier argument de la méthode n'est pas forcé d'être nommé self et peut avoir un autre nom.

import inspect

def is_bounded(function):
    params = inspect.signature(function).parameters
    return params.get('self', None) is not None

im_self attribut (uniquement Python 2)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top