61 votes

Python: self.__class__ vs. type(self)

Je me demande s'il y a une différence entre

class Test(object):
    def __init__(self):
        print self.__class__.__name__

et

class Test(object):
    def __init__(self):
        print type(self).__name__

?

Y a-t-il une raison de préférer l'un ou l'autre ?

(Dans mon cas d'utilisation, je veux l'utiliser pour déterminer le nom du logger, mais je suppose que cela n'a pas d'importance)

39voto

ThiefMaster Points 135805
>>> class Test(object): pass
>>> t = Test()
>>> type(t) is t.__class__
True
>>> type(t)
__main__.Test

Donc ceux-ci sont les mêmes. Je utiliserais self.__class__ car il est plus évident ce que c'est.

Cependant, type(t) ne fonctionnera pas pour les anciennes classes car le type d'une instance d'une vieille classe est instance alors que le type d'une instance de nouvelle classe est sa classe:

>>> class Test(): pass
>>> t = Test()
>>> type(t) is t.__class__
False
>>> type(t)
instance

5voto

Lattyware Points 37257

Dans la mesure de mes connaissances, ce dernier est simplement une façon plus agréable de faire le premier.

Ce n'est pas si inhabituel en Python, considérez repr(x), qui appelle simplement x.__repr__() ou len(x), qui appelle simplement x.__len__(). Python préfère utiliser des fonctions intégrées pour les fonctions courantes que vous êtes susceptible d'utiliser sur une gamme de classes, et les implémente généralement en appelant les méthodes __x__().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X