Python: self .__ class__ vs. type (self)

Me pregunto si hay una diferencia entre

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

y

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

?

¿Hay alguna razón para preferir uno u otro?

(En mi caso de uso, quiero usarlo para determinar el nombre del registrador, pero supongo que esto no importa)

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

Así que esos dos son los mismos. Yo usaría self.__class__ ya que es más obvio lo que es.

Sin embargo, el type(t) no funcionará para las clases de estilo antiguo, ya que el tipo de una instancia de una clase de estilo antiguo es una instance mientras que el tipo de una clase de estilo nuevo es su clase:

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

Que yo sepa, este último es solo una forma más agradable de hacer el primero.

En realidad no es tan inusual en Python, considere repr(x) , que simplemente llama x.__repr__() o len(x) , que solo llama x.__len__() . Python prefiere usar funciones integradas para funciones comunes que es probable que use en un rango de clases, y generalmente las implementa llamando a los __x__() .