web-dev-qa-db-fra.com

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

Dans les anciennes versions de python lorsque vous créez une classe en python, elle peut hériter de objet, autant que je sache, une fonction intégrée python élément qui permet à votre objet d'être un objet de nouveau style.

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

Remercier!

85
thomas

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

78
SilentGhost

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 de builtins.objectindépendamment de ce que cela indique à l'époque.

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 réellement 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

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

67
Philip Adler