Python Language Toutes les classes sont des "nouvelles classes" dans Python 3.


Exemple

Dans Python 3.x toutes les classes sont des classes de nouveau style ; lors de la définition d'une nouvelle classe, python le fait hériter implicitement de l' object . En tant que tel, la spécification d’un object dans une définition de class est une option complètement facultative:

Python 3.x 3.0
class X: pass
class Y(object): pass

Ces deux classes contiennent désormais des object dans leur mro (ordre de résolution de la méthode):

Python 3.x 3.0
>>> X.__mro__
(__main__.X, object)

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

Dans Python 2.x classes sont, par défaut, d'anciennes classes; ils n'héritent pas implicitement d' object . Cela fait que la sémantique des classes diffère selon que l'on ajoute explicitement un object tant que class base:

Python 2.x 2.3
class X: pass
class Y(object): pass

Dans ce cas, si nous essayons d'imprimer le __mro__ de Y , une sortie similaire à celle du cas Python 3.x apparaîtra:

Python 2.x 2.3
>>> Y.__mro__
(<class '__main__.Y'>, <type 'object'>)

Cela se produit parce que nous avons explicitement fait hériter Y de l’objet lors de sa définition: class Y(object): pass . Pour la classe X qui n'hérite pas d'objet, l'attribut __mro__ n'existe pas, en essayant d'y accéder aboutit à une erreur AttributeError .

Afin de garantir la compatibilité entre les deux versions de Python, les classes peuvent être définies avec un object comme classe de base:

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

Alternativement, si la variable __metaclass__ est définie pour type une portée globale, toutes les classes définies ultérieurement dans un module donné sont implicitement new-style sans avoir à hériter explicitement de l' object :

__metaclass__ = type

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