Comment voulez-vous vérifier si une méthode python est lié ou pas?
-
09-06-2019 - |
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é?
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 estNone
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, sesim_self
attribut de l'instance, et la méthode objet est dit d'être lié.Dans les deux cas, la nouvelle méthode deim_class
l'attribut est la classe dont la récupération a lieu, et sonim_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__
, etim_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)