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)