Question La classe Python hérite de l'objet


Y a-t-il une raison pour qu'une déclaration de classe hérite de object?

Je viens de trouver du code qui fait cela et je ne peux pas trouver une bonne raison pour cela.

class MyClass(object):
    # class code follows...

752
2017-10-25 14:15


origine


Réponses:


Y a-t-il une raison pour qu'une déclaration de classe hérite de object?

tl; dr: En Python 3, mis à part la compatibilité entre Python 2 et 3, sans raison. En Python 2, de nombreuses raisons.


Histoire de Python 2.x:

En Python 2.x (à partir de 2.2) il y a deux styles de classes en fonction de la présence ou de l'absence de object en tant que classe de base:

  1. "Style classique classes: ils n'ont pas object en tant que classe de base:

    >>> class ClassicSpam:      # no base class
    ...     pass
    >>> ClassicSpam.__bases__
    ()
    
  2. "nouveau style classes: ils ont, directement ou indirectement (Par exemple hériter d'un type intégré), object en tant que classe de base:

    >>> class NewSpam(object):           # directly inherit from object
    ...    pass
    >>> NewSpam.__bases__
    (<type 'object'>,)
    >>> class IntSpam(int):              # indirectly inherit from object...
    ...    pass
    >>> IntSpam.__bases__
    (<type 'int'>,) 
    >>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
    (<type 'object'>,)
    

Sans aucun doute, lors de l'écriture d'un cours, vous aurez toujours vouloir aller pour des cours de style nouveau. Les avantages de le faire sont nombreux, pour en citer quelques-uns:

  • Prise en charge des descripteurs. Plus précisément, les constructions suivantes sont rendues possibles avec des descripteurs:

    1. classmethod: Une méthode qui reçoit la classe en tant qu'argument implicite au lieu de l'instance.
    2. staticmethod: Une méthode qui ne reçoit pas l'argument implicite self comme premier argument.
    3. propriétés avec property: Créer des fonctions pour gérer l'obtention, le réglage et la suppression d'un attribut.
    4. __slots__: Enregistre les consommations de mémoire d'une classe et permet également un accès plus rapide aux attributs. Bien sûr, il le fait imposer des limites.
  • le __new__ méthode statique: permet de personnaliser la création des nouvelles instances de classe.

  • Ordre de résolution de méthode (MRO): dans quel ordre les classes de base d'une classe seront-elles recherchées en essayant de résoudre quelle méthode appeler?

  • Relatif à MRO, super appels. Regarde aussi, super() considéré super.

Si vous n'héritez pas de objectoublie ça. Une description plus complète des points précédents avec d'autres avantages de "nouvelles" classes de style peut être trouvée ici.

L'un des inconvénients des classes de style nouveau est que la classe elle-même est plus exigeante en mémoire. Sauf si vous créez de nombreux objets de classe, cependant, je doute que ce soit un problème et c'est un naufrage négatif dans une mer de positifs.


Histoire de Python 3.x:

En Python 3, les choses sont simplifiées. Seules les classes de style nouveau existent (appelées clairement classes), donc la seule différence dans l'ajout object vous demande de taper 8 autres caractères. Ce:

class ClassicSpam:
    pass

est complètement équivalent (en dehors de leur nom :-) à ceci:

class NewSpam(object):
     pass

et à ceci:

class Spam():
    pass

tous ont object dans leurs __bases__.

>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]

Alors, que devrais-tu faire?

En Python 2:  hérite toujours de object explicitement. Obtenez les avantages.

En Python 3: hériter de object si vous écrivez du code qui essaie d'être agnostique en Python, c'est-à-dire, il doit fonctionner à la fois en Python 2 et en Python 3. Sinon, cela ne fait vraiment aucune différence puisque Python l'insère dans les coulisses.


243
2017-07-12 15:34



Python 3.x:
class MyClass(object): = nouvelle classe de style
class MyClass: = classe de style nouveau (hérite implicitement de l'objet)

Python 2.x:
class MyClass(object): = nouvelle classe de style
class MyClass: = CLASSE ANCIENNE

Explication:

Lorsque vous définissez des classes de base dans Python 3.x, vous êtes autorisé à supprimer l'objet de la définition. Cependant, cela peut ouvrir la porte à un problème très difficile à suivre ...

Python a introduit des classes de style nouveau dans Python 2.2, et maintenant les classes de style ancien sont vraiment anciennes. Discussion des classes à l'ancienne est enterré dans les documents 2.x, et inexistant dans les documents 3.x.

Le problème est, la syntaxe pour les classes de style ancien dans Python 2.x est la même que la syntaxe alternative pour les classes de style nouveau dans Python 3.x. Python 2.x est toujours très largement utilisé (par exemple GAE, Web2Py), et tout code (ou codeur) apportant involontairement des définitions de classes de style 3.x dans le code 2.x va se retrouver avec des objets de base sérieusement obsolètes. Et parce que les classes à l'ancienne ne sont sur le radar de personne, ils ne sauront probablement pas ce qui les a frappés.

Donc, épelez le long chemin et sauvez quelques développeurs 2.x les larmes.


494
2018-02-25 21:15



Oui, c'est un objet 'nouveau style'. C'était une fonctionnalité introduite dans python2.2.

Les nouveaux objets de style ont un modèle d'objet différent des objets classiques, et certaines choses ne fonctionneront pas correctement avec les objets de style ancien, par exemple, super(), @property et descripteurs. Voir Cet article pour une bonne description de ce qu'est une nouvelle classe de style.

SO lien pour une description des différences: Quelle est la différence entre le style ancien et les nouvelles classes de style en Python?


388
2017-10-25 14:20



Histoire de Apprenez Python à la dure:

L'interprétation originale de Python d'une classe a été brisée dans de nombreux sérieux   façons. Au moment où cette faute a été reconnue, il était déjà trop tard,   et ils devaient le soutenir. Afin de résoudre le problème, ils avaient besoin   un style "nouvelle classe" pour que les "vieilles classes" continuent de fonctionner   mais vous pouvez utiliser la nouvelle version plus correcte.

Ils ont décidé qu'ils utiliseraient un mot "objet", en minuscules, pour être   la "classe" dont vous héritez pour faire une classe. C'est confus,   mais une classe hérite de la classe nommée "objet" pour faire une classe, mais   ce n'est pas un objet vraiment c'est une classe, mais n'oublie pas d'hériter   de l'objet.

Aussi, juste pour vous faire savoir quelle est la différence entre les classes de style nouveau et les classes de style ancien, c'est que les classes de nouveau style héritent toujours de object classe ou d'une autre classe qui a hérité de object:

class NewStyle(object):
    pass

Un autre exemple est:

class AnotherExampleOfNewStyle(NewStyle):
    pass

Alors qu'une classe de base à l'ancienne ressemble à ceci:

class OldStyle():
    pass

Et une classe enfant à l'ancienne ressemble à ceci:

class OldStyleSubclass(OldStyle):
    pass

Vous pouvez voir qu'une classe de base Old Style n'hérite d'aucune autre classe, cependant, les classes Old Style peuvent, bien sûr, hériter les unes des autres. Hériter de l'objet garantit que certaines fonctionnalités sont disponibles dans chaque classe Python. Les nouvelles classes de style ont été introduites dans Python 2.2


29
2017-11-04 10:54



Oui ce est historique. Sans cela, il crée une classe à l'ancienne.

Si tu utilises type() sur un objet de style ancien, vous obtenez simplement "instance". Sur un objet nouveau style, vous obtenez sa classe.


23
2017-10-25 14:20



La syntaxe de l'instruction de création de classe:

class <ClassName>(superclass):
    #code follows

En l'absence de toute autre super-classe dont vous souhaitez hériter, le superclass devrait toujours être object, qui est la racine de toutes les classes en Python.

object est techniquement la racine des classes "new-style" en Python. Mais les cours de style nouveau d'aujourd'hui sont aussi bons que d'être le seul style de cours.

Mais, si vous n'utilisez pas explicitement le mot object lors de la création de classes, alors que d'autres ont mentionné, Python 3.x hérite implicitement de la object superclasse. Mais je suppose que explicite est toujours mieux que implicite (enfer)

Référence


6
2017-10-20 05:37



Cela crée un nouvelle classe de style.


1
2017-10-25 14:20