Grâce Sr2222 de remarquer qu'il me manquait le point de...
Voici le corrigé de l'approche qui est juste comme Alex mais il n'a pas besoin d'importer quoi que ce soit. Je ne pense pas que c'est une amélioration, même si, à moins qu'il y a une énorme hiérarchie de classes héritées que cette approche s'arrête dès que la classe de définition est trouvé, au lieu de renvoyer l'ensemble de l'héritage, getmro
n'. Comme l'a dit, c'est un très improbable.
def get_class_that_defined_method(method):
method_name = method.__name__
if method.__self__:
classes = [method.__self__.__class__]
else:
#unbound method
classes = [method.im_class]
while classes:
c = classes.pop()
if method_name in c.__dict__:
return c
else:
classes = list(c.__bases__) + classes
return None
Et l'Exemple:
>>> class A(object):
... def test(self): pass
>>> class B(A): pass
>>> class C(B): pass
>>> class D(A):
... def test(self): print 1
>>> class E(D,C): pass
>>> get_class_that_defined_method(A().test)
<class '__main__.A'>
>>> get_class_that_defined_method(A.test)
<class '__main__.A'>
>>> get_class_that_defined_method(B.test)
<class '__main__.A'>
>>> get_class_that_defined_method(C.test)
<class '__main__.A'>
>>> get_class_that_defined_method(D.test)
<class '__main__.D'>
>>> get_class_that_defined_method(E().test)
<class '__main__.D'>
>>> get_class_that_defined_method(E.test)
<class '__main__.D'>
>>> E().test()
1
Alex solution renvoie les mêmes résultats. Aussi longtemps que Alex approche peut être utilisée, je voudrais l'utiliser à la place de celui-ci.