Est-il nécessaire ou utile d'hériter de l'objet de python dans Python 3.x?

92

Dans l'ancienne version de python, lorsque vous créez une classe en python, elle peut hériter d'un objet, ce qui est, dans la mesure où je comprends, un élément python intégré spécial qui permet à votre objet d'être un objet de nouveau style.

Qu'en est-il de la version plus récente (> 3.0 et 2.6)? J'ai cherché sur Google l'objet de classe mais j'obtiens tellement de résultats (pour des raisons évidentes). Un indice?

Remercier!

Thomas
la source
2
Si votre code sera également utilisé sous 2.x, il est bon d'être explicite.
smci
1
Il est bien répondu à cette question: stackoverflow.com/questions/4015417/…
nngeek

Réponses:

89

Vous n'avez pas besoin d'hériter de objectpour avoir un nouveau style en python 3. Toutes les classes sont de style nouveau.

SilentGhost
la source
5
Notez que cela signifie que toutes les classes héritent de objectpeu importe si vous tapez un explicite (object)ou non dans Python 3.1
u0b34a0f6ae
8
Vous n'êtes pas obligé de le faire, mais le "Portage du code Python vers Python 3" indique qu'il est toujours valide: docs.python.org/py3k/howto/pyporting.html#subclass-object Aussi: docs.python.org/reference/ …
hyperboreean
D' après ce post mentionné dans le commentaire de nngeek, il semble qu'une bonne référence stable pour l'ancien ou le nouveau style (uniquement vraiment pertinent pour Py2) est: docs.python.org/2/reference / ... - les liens ci-dessus semblaient avoir depuis changé.
Eric Cousineau le
77

Je me rends compte que c'est une vieille question, mais il convient de noter que même en python 3, ces deux choses ne sont pas tout à fait la même chose.

Si vous héritez explicitement de object, ce que vous faites réellement hérite builtins.object de ce que cela indique à ce moment-là.

Par conséquent, je pourrais avoir un module (très farfelu) qui remplace l'objet pour une raison quelconque. Nous appellerons ce premier module "newobj.py":

import builtins

old_object = builtins.object  # otherwise cyclic dependencies

class new_object(old_object):

    def __init__(self, *args, **kwargs):
        super(new_object, self).__init__(*args, **kwargs)
        self.greeting = "Hello World!" 

builtins.object = new_object  #overrides the default object

Puis dans un autre fichier ("klasses.py"):

class Greeter(object):
    pass

class NonGreeter:
    pass

Puis dans un troisième fichier (que nous pouvons effectivement exécuter):

import newobj, klasses  # This order matters!

greeter = klasses.Greeter()
print(greeter.greeting)  # prints the greeting in the new __init__

non_greeter = klasses.NonGreeter()
print(non_greeter.greeting) # throws an attribute error

Ainsi, vous pouvez voir que, dans le cas où il hérite explicitement d'un objet, nous obtenons un comportement différent de celui où vous autorisez l'héritage implicite.

Philip Adler
la source
1
C'est un commentaire inutile qui distrait de la question originale et de la réponse (correcte). Bien sûr, si vous modifiez les fonctions intégrées, il se comporte différemment. Ne fais pas ça.
Harmv
12
C'est pertinent car en général on s'attend à ce que le comportement soit équivalent. Ce n'est pas équivalent, d'où mes observations.
Philip Adler le