[Python-Dev] type(obj) vs. obj.__class__
Serhiy Storchaka
storchaka at gmail.com
Tue Oct 20 04:21:28 EDT 2015
On 18.10.15 00:45, Eric Snow wrote:
> So, would it make sense to establish some concrete guidelines about
> when to use type(obj) vs. obj.__class__? If so, what would those be?
> It may also be helpful to enumerate use cases for "type(obj) is not
> obj.__class__".
My conclusion of this discussion. In Python 3 type(obj) and
obj.__class__ are the same in common case. Assigning obj.__class__ is a
way to change type(obj). If the assignment is successful, type(obj)
becomes the same as obj.__class__. This is used in importlib for lazy
importing and some clever classes like the RingBuffer recipe. But
__class__ assignment has many restrictions, and changing Python to C
implementation or adding __slots__ for sure adds new restrictions.
obj.__class__ is different from type(obj) in proxy classes like weakref
or Mock. isinstance() and pickle take __class__ to account to support
proxies.
Unless we write proxy class or code that should handle proxy classes, we
shouldn't care about the difference between type(obj) and obj.__class__,
and can use what is the more convenient. In Python this is obj.__class__
(avoids globals lookup), and in C this is type(obj) (much simpler and
reliable code).
More information about the Python-Dev
mailing list