type versus __class__

Steven D'Aprano steve+comp.lang.python at pearwood.info
Wed Jan 14 20:26:00 EST 2015


There are (at least) two ways to determine the type of something in Python:


type(obj)

obj.__class__


By design, they are not guaranteed to give the same result. Is there a
definitive explanation given by the docs for the difference and which you
should use under different circumstances?


In Python 2, the type() of classic classes is always the same thing:

py> class A:  # classic class
...     def spam(self): return "from A"
...
py> class B:
...     def spam(self): return "from B"
...
py> a = A()
py> b = B()
py> a.__class__ is b.__class__
False
py> type(a) is type(b)  # a special type "instance"
True


Writing to __class__ lets you modify the behaviour of the instance:

py> a.spam()
'from A'
py> a.__class__ = B
py> a.spam()
'from B'


New-style classes are different:

py> class C(object):  # new-style class
...     def spam(self):
...             return "from C"
...
py> class D(object):
...     def spam(self):
...             return "from D"
...
py> c = C()
py> d = D()
py> c.__class__ is d.__class__
False
py> type(c) is type(d)
False

Like classic classes, you can override the __class__ attribute on instances,
and change their behaviour:

py> c.spam()
'from C'
py> c.__class__ = D
py> c.spam()
'from D'


Any other differences? 


-- 
Steven




More information about the Python-list mailing list