Python Language Incompatibilities moving from Python 2 to Python 3 All classes are "new-style classes" in Python 3.


Example

In Python 3.x all classes are new-style classes; when defining a new class python implicitly makes it inherit from object. As such, specifying object in a class definition is a completely optional:

Python 3.x3.0
class X: pass
class Y(object): pass

Both of these classes now contain object in their mro (method resolution order):

Python 3.x3.0
>>> X.__mro__
(__main__.X, object)

>>> Y.__mro__
(__main__.Y, object)

In Python 2.x classes are, by default, old-style classes; they do not implicitly inherit from object. This causes the semantics of classes to differ depending on if we explicitly add object as a base class:

Python 2.x2.3
class X: pass
class Y(object): pass

In this case, if we try to print the __mro__ of Y, similar output as that in the Python 3.x case will appear:

Python 2.x2.3
>>> Y.__mro__
(<class '__main__.Y'>, <type 'object'>)

This happens because we explicitly made Y inherit from object when defining it: class Y(object): pass. For class X which does not inherit from object the __mro__ attribute does not exist, trying to access it results in an AttributeError.

In order to ensure compatibility between both versions of Python, classes can be defined with object as a base class:

class mycls(object):
    """I am fully compatible with Python 2/3"""

Alternatively, if the __metaclass__ variable is set to type at global scope, all subsequently defined classes in a given module are implicitly new-style without needing to explicitly inherit from object:

__metaclass__ = type

class mycls:
    """I am also fully compatible with Python 2/3"""