J'ai constaté que les deux travaux suivants:
class Foo():
def a(self):
print "hello"
class Foo(object):
def a(self):
print "hello"
Toutes les classes Python devraient-elles étendre l'objet? Y a-t-il des problèmes potentiels avec le fait de ne pas étendre l'objet?
python
inheritance
Kara
la source
la source
class Foo():
etclass Foo:
? Comme je l'observe, les deux fonctionnent en Python 3.Réponses:
En Python 2, ne pas hériter de
object
créera une classe à l'ancienne, qui, entre autres effets,type
donne des résultats différents:contre.
De plus, les règles pour l'héritage multiple sont différentes 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 de
object
est devenu implicite. Donc, préférez toujours les nouvelles classes de style à moins que vous n'ayez besoin d'une compatibilité descendante avec l'ancien logiciel.la source
Dans Python 3, les classes s'étendent
object
implicitement, que vous le disiez vous-même ou non.Dans Python 2, il existe des classes de style ancien et nouveau . Pour signaler qu'une classe est de nouveau style, vous devez hériter explicitement de
object
. Sinon, l'implémentation à l'ancienne est utilisée.Vous voulez généralement une classe de style nouveau. Hériter de
object
explicitement. Notez que cela s'applique également au code Python 3 qui vise à être compatible avec Python 2.la source
En python 3, vous pouvez créer une classe de trois manières différentes et en interne, elles sont toutes égales (voir exemples). Peu importe la façon dont vous créez une classe, toutes les classes de python 3 héritent d'une classe spéciale appelée object . L' objet de classe est une classe fondamentale en python et fournit de nombreuses fonctionnalités telles que les méthodes à double soulignement, les descripteurs, la méthode super (), la méthode property (), etc.
Exemple 1.
Exemple 2.
Exemple 3.
la source
object
fait référence à intégréobject
. Si nous devons prendre en compte le fait que n'importe quel identifiant intégré de CPython peut être remplacé, nous pourrions à peine faire une affirmation sur le modèle de données. Peut-on sérieusement soutenir questr
n'accepte pas toujours une chaîne comme argument parce qu'on pourrait l'assignerbuiltins.str = None
?Oui, toutes les classes Python devraient étendre (ou plutôt une sous-classe, c'est Python ici) objet. Bien que normalement aucun problème sérieux ne se produise, dans certains cas (comme avec plusieurs arbres d'héritage), cela sera important. Cela garantit également une meilleure compatibilité avec Python 3.
la source
Comme d'autres réponses l'ont couvert, l'héritage Python 3 de l'objet est implicite. Mais ils n'indiquent pas ce que vous devez faire et ce que sont les conventions.
Les exemples de documentation Python 3 utilisent tous le style suivant qui est une convention, je vous suggère donc de suivre ceci pour tout code futur dans Python 3.
Source: https://docs.python.org/3/tutorial/classes.html#class-objects
Exemple de devis:
Une autre citation:
la source
en python3, il n'y a pas de différence, mais en python2, ne pas étendre
object
vous donne des classes à l'ancienne; vous souhaitez utiliser une classe de style nouveau sur une classe de style ancien.la source