Python: self.__class__ vs. type(self) [duplicate]
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)
>>> 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
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.