140 votes

Toutes les classes Python doivent-elles étendre object ?

J'ai constaté que les deux méthodes suivantes fonctionnent :

class Foo():
    def a(self):
        print "hello"

class Foo(object):
    def a(self):
        print "hello"

Toutes les classes Python devraient-elles étendre object ? Y a-t-il des problèmes potentiels à ne pas étendre object ?

3 votes

Y a-t-il une différence entre class Foo(): y class Foo: ? Comme je l'ai observé, les deux fonctionnent dans Python 3.

0 votes

C'est bien répondu dans cette question : stackoverflow.com/questions/4015417/

126voto

larsmans Points 167484

Dans Python 2, le fait de ne pas hériter de object créera une classe à l'ancienne, ce qui, entre autres effets, provoquera type pour donner des résultats différents :

>>> class Foo: pass
... 
>>> type(Foo())
<type 'instance'>

vs.

>>> class Bar(object): pass
... 
>>> type(Bar())
<class '__main__.Bar'>

Les règles d'héritage multiple sont également les suivantes différents d'une manière que je n'essaierai même pas de résumer ici. Toute la bonne documentation que j'ai vue sur MI décrit des classes de style nouveau.

Enfin, les classes à l'ancienne ont disparu dans Python 3, et l'héritage à partir de object est devenu implicite. Ainsi, préférez toujours les classes de style nouveau, sauf si vous avez besoin d'une compatibilité rétroactive avec un ancien logiciel.

75voto

uʍop ǝpısdn Points 16540

Dans Python 3, les classes étendent object implicitement, que vous le disiez vous-même ou non.

Dans Python 2, il y a ancien style et nouveau style classes. Pour signaler qu'une classe est de type nouveau, vous devez hériter explicitement de object . Sinon, l'ancienne implémentation est utilisée.

Vous voulez généralement une classe de style nouveau. Hériter de object de manière explicite. Notez que cela s'applique également au code Python 3 qui vise à être compatible avec Python 2.

0 votes

4 votes

Il y a beaucoup de code python 3 qui utilise foo(object) :. S'agit-il simplement d'une convention ?

2 votes

@RFVenter Il peut s'agir d'un code censé fonctionner à la fois sous Python 2 et 3, auquel cas vous devez sous-classer explicitement l'objet afin que la classe se comporte de la même manière sous Python 2.

17voto

N Randhawa Points 2888

Dans python 3, vous pouvez créer une classe de trois manières différentes et, en interne, elles sont toutes égales (voir les exemples). La façon dont vous créez une classe n'a pas d'importance, toutes les classes de python 3 héritent d'une classe spéciale appelée objet . La classe objet est une classe fondamentale en python et fournit beaucoup de fonctionnalités comme les méthodes double-underscore, les descripteurs, la méthode super(), la méthode property() etc.

Exemple 1.

class MyClass:
 pass

Exemple 2.

class MyClass():
 pass

Exemple 3.

class MyClass(object):
  pass

1voto

pydsigner Points 1121

Oui, toutes les classes Python devraient étendre (ou plutôt sous-classer, c'est Python ici) l'objet. Bien que normalement aucun problème sérieux ne se produira, dans certains cas (comme avec les arbres d'héritage multiples) cela sera important. Cela assure également une meilleure compatibilité avec Python 3.

1 votes

Exactement, techniquement si vous ne le faites pas vous obtiendrez une classe classique, mais il n'y a pas de réels avantages à cela et ce n'est pas supporté par python 3 de toute façon

0 votes

Je suis curieux de savoir pourquoi il améliore la compatibilité avec python3. D'après ce que j'ai compris, python3 étend automatiquement les objets même si vous ne le spécifiez pas, n'est-ce pas ?

2 votes

@PaulLo Exact, mais si vous héritez explicitement d'object, vous obtiendrez le même comportement (nouveau style) sur Python 2 et Python 3. Il ne s'agit pas de modifier le fonctionnement de Python 3, mais d'utiliser la compatibilité avec Python 2.

1voto

jmoz Points 984

Comme d'autres réponses l'ont couvert, l'héritage de Python 3 à partir d'un objet est implicite. Mais elles ne précisent pas ce qu'il faut faire et ce qu'est la convention.

Les exemples de la documentation de Python 3 utilisent tous le style suivant, qui est une convention. Je vous suggère donc de le suivre pour tout code futur en Python 3.

class Foo:
    pass

Source : https://docs.python.org/3/tutorial/classes.html#class-objects

Exemple de citation :

Les objets de classe supportent deux types d'opérations : les références d'attributs et l'instanciation.

Les références d'attribut utilisent la syntaxe standard utilisée pour toutes les références d'attribut d'attributs en Python : obj.name. Les noms d'attributs valides sont tous les noms noms qui se trouvaient dans l'espace de noms de la classe lorsque l'objet classe a été créé. Ainsi, si la définition de la classe ressemble à ceci :

class MyClass:
    """A simple example class"""
    i = 12345

    def f(self):
        return 'hello world'

Une autre citation :

D'une manière générale, les variables d'instance sont pour les données uniques à chaque instance et les variables de classe sont pour les attributs et les méthodes partagées par toutes les instances de la classe :

class Dog:

    kind = 'canine'         # class variable shared by all instances

    def __init__(self, name):
        self.name = name    # instance variable unique to each instance

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X