Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does inheriting from object make a difference in Python? [duplicate]

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?

like image 540
prosseek Avatar asked Aug 20 '13 22:08

prosseek


1 Answers

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.

like image 115
arshajii Avatar answered Sep 20 '22 01:09

arshajii