class A(object): def get_class(self): return self.__class__ class B(A): def __init__(self): A.__init__(self) b = B() print b.get_class()
Ce code imprimera .
Comment puis-je obtenir le nom de la classe où la méthode a été définie (à savoir A
)?
De la documentation: https://docs.python.org/2/reference/datamodel.html#the-standard-type-hierarchy
Les objects de classe ont un atsortingbut __name__
. Il __bases__
peut-être plus __bases__
la __bases__
les classes de base à travers les __bases__
attr de la classe dérivée (si le code doit vivre dans la classe dérivée par exemple).
>>> class Base(object): ... pass ... >>> class Derived(Base): ... def print_base(self): ... for base in self.__class__.__bases__: ... print base.__name__ ... >>> foo = Derived() >>> foo.print_base() Base
inspect.getmro(cls)
Retourne un tuple de classes de base de classe cls, y compris cls, dans l’ordre de résolution de la méthode. Aucune classe n’apparaît plus d’une fois dans ce tuple. Notez que l’ordre de résolution de la méthode dépend du type de cls. À moins d’utiliser un métatype très particulier défini par l’utilisateur, cls sera le premier élément du tuple.
import inspect inspect.getmro(B)
le résultat sera:
(, , )
Le premier élément est la classe elle-même, le deuxième élément est toujours le premier des parents. Après cela, les choses peuvent devenir plus compliquées.
Vous pourriez changer
return self.__class__ return A().__class__
Comme il n’y a pas d’autre instance de A () disponible …