72 votes

Les classes qui ne peuvent pas être sous-classé ?

Est-il une règle sur laquelle intégré et de la bibliothèque standard les classes ne sont pas subclassable ("final")?

Comme de Python 3.3, voici quelques exemples:

  • bool
  • function
  • operator.itemgetter
  • slice

J'ai trouvé une question qui traite de la mise en œuvre de la "finale" des classes, à la fois en C et pur Python.

J'aimerais comprendre quelles sont les raisons qui peuvent expliquer pourquoi une classe est choisie pour être le "final" en premier lieu.

27voto

max Points 6673

Il semble y avoir deux raisons pour qu'une classe "final" en Python.

1. Violation de l'Invariant de Classe

Les Classes qui suivent le pattern Singleton ont un invariant qu'il y a un nombre limité (pré-déterminé) le nombre d'occurrences. Toute violation de cet invariant dans une sous-classe d'être incompatible avec la classe' intention, et ne serait pas fonctionner correctement. Exemples:

  • bool: True, False; voir Guido commentaires
  • NoneType: None
  • NotImplementedType: NotImplemented
  • ellipsis: Ellipsis

Il peut y avoir d'autres cas que le pattern Singleton dans cette catégorie, mais je ne suis pas au courant de tout.

2. Pas Convaincant Cas D'Utilisation

Une classe implémentée en C nécessite un travail supplémentaire pour permettre la dérivation de (au moins dans Disponible). Faire un tel travail sans convaincre cas d'utilisation n'est pas très attrayant, de sorte que les bénévoles sont moins susceptibles de se présenter. Exemples:

Note 1:

A l'origine, je pensais qu'il n'y étaient valables en cas d'utilisation, mais tout simplement un manque d'intérêt, dans le sous-classement d' function et operator.itemgetter. Grâce à @agf pour préciser que les cas d'utilisation proposés ici et ici ne sont pas convaincants (voir @agf commentaires à la question).

Note 2:

Mon souci c'est que l'autre Python de la mise en œuvre pourrait accidentellement permettent de dériver une classe finale Disponible. Cela peut entraîner dans du code non portable (un cas d'utilisation peut être faible, mais quelqu'un pourrait encore écrire du code qui les sous-classes function si leurs Python prend en charge). Ce problème peut être résolu en cochant la documentation Python intégré toutes et standard de la bibliothèque de classes qui ne peuvent pas être sous-classé, et en exigeant que toutes les implémentations de suivre Disponible le comportement à cet égard.

Note 3:

Le message produit par Disponible dans tous les cas ci-dessus est:

TypeError: type 'bool' is not an acceptable base type

Il est tout à fait énigmatique, que de nombreuses questions sur ce sujet montrent. Je vais soumettre une proposition visant à ajouter un alinéa à la documentation qui explique final classes, et peut-être même changer le message d'erreur:

TypeError: type 'bool' is final (non-extensible)

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