web-dev-qa-db-fra.com

Est-ce que toutes les classes Python doivent étendre l'objet?

J'ai trouvé que les deux travaux suivants:

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

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

Est-ce que toutes les classes Python doivent étendre un objet? Existe-t-il un problème potentiel avec le fait de ne pas étendre un objet?

118
Kara

Dans Python 2, ne pas hériter de object créera une classe de style ancien qui, entre autres effets, obligera type à donner des résultats différents:

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

vs.

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

De plus, les règles pour l'héritage multiple sont différentes d'une manière que je ne vais même pas essayer de résumer ici. Toute la bonne documentation que j'ai vue sur MI décrit des classes de style nouveau.

Enfin, les anciennes classes de style ont disparu dans Python 3 et l'héritage de object est devenu implicite. Préférez donc toujours les nouvelles classes de style, sauf si vous avez besoin d'une version antérieure de votre logiciel.

106
Fred Foo

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

Dans Python 2, il y a des classes ancien-style et nouveau-style . Pour signaler qu'une classe est un nouveau style, vous devez hériter explicitement de object Si ce n'est pas le cas, l'ancienne implémentation est utilisée.

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

58
slezica

Dans python 3, vous pouvez créer une classe de trois manières différentes. En interne, elles sont toutes égales (voir des exemples). Quelle que soit la manière dont vous créez une classe, toutes les classes de python 3 hérite d'une classe spéciale appelée objet. La classe objet est une classe fondamentale en python et fournit de nombreuses fonctionnalités comme les méthodes de double soulignement, 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
16
N Randhawa

Oui, toutes les classes Python devraient être étendues (ou plutôt une sous-classe, il s'agit de Python ici) objet. Bien que normalement aucun problème grave ne se produira, dans certains cas (comme Ce sera important, cela assurera également une meilleure compatibilité avec Python 3.

2
pydsigner

en python3, il n'y a pas de différence, mais en python2, ne pas étendre object vous donne une classe de style ancien; vous souhaitez utiliser une classe de style nouveau par rapport à une classe de style ancien.

0
thkang