Python: self.__class__ vs. type(self)

Python

Python Problem Overview


I'm wondering if there is a difference between

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

and

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

?

Is there a reason to prefer one or the other?

(In my use case I want to use it to determine the logger name, but I guess this doesn't matter)

Python Solutions


Solution 1 - Python

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

So those two are the same. I would use self.__class__ since it's more obvious what it is.

However, type(t) won't work for old-style classes since the type of an instance of an old-style class is instance while the type of a new-style class instance is its class:

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

Solution 2 - Python

As far as I am aware, the latter is just a nicer way of doing the former.

It's actually not that unusual in Python, consider repr(x), which just calls x.__repr__() or len(x), which just calls x.__len__(). Python prefers to use built-ins for common functions that you are likely to use over a range of classes, and generally implements these by calling __x__() methods.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMartin SchulzeView Question on Stackoverflow
Solution 1 - PythonThiefMasterView Answer on Stackoverflow
Solution 2 - PythonGareth LattyView Answer on Stackoverflow