Why does inheriting from object make a difference in Python?
inheritance, object, python
Solution
In Python 3, those two are the same. In Python 2, however:
class A: pass # old-style class
class B(object): pass # new-style class
From New-style and classic classes in the documentation:
Up to Python 2.1, old-style classes were the only flavour available to the user. The concept of (old-style) class is unrelated to the concept of type: if `x` is an instance of an old-style class, then `x.__class__` designates the class of `x`, but `type(x)` is always `<type 'instance'>`. This reflects the fact that all old-style instances, independently of their class, are implemented with a single built-in type, called instance.
New-style classes were introduced in Python 2.2 to unify classes and types. A new-style class is neither more nor less than a user-defined type. If `x` is an instance of a new-style class, then `type(x)` is the same as `x.__class__`.
The major motivation for introducing new-style classes is to provide a unified object model with a full meta-model. It also has a number of immediate benefits, like the ability to subclass most built-in types, or the introduction of "descriptors", which enable computed properties.
For these reasons, it's a good idea to use new-style classes whenever you can. The only reason old-style classes even exist in Python 2.2+ is for backwards compatibility; in Python 3, old-style classes were removed.
Problem
When class is inherited from nothing, I have an object of instance type. ``` >>> class A(): pass; >>> a = A() >>> type(a) <type 'instance'> >>> type(a) is A False >>> type(A) <type 'classobj'> ``` However, when I have the same class inheriting from an object, the created object is type of A. ``` >>> class A(object): pass; >>> a = A() >>> type(a) <class '__main__.A'> >>> type(a) is A True >>> type(A) <type 'type'> ``` What is the logic behind this? Does this mean every class should inherit from object?