どの組み込みおよび標準ライブラリ クラスがサブクラス化できない (「最終」) かについての規則はありますか?
Python 3.3 の時点で、いくつかの例を次に示します。
bool
function
operator.itemgetter
slice
Cと純粋なPythonの両方で、「最終」クラスの実装を扱う質問を見つけました。
そもそもクラスが「最終」として選択された理由を説明できる理由を理解したいと思います。
どの組み込みおよび標準ライブラリ クラスがサブクラス化できない (「最終」) かについての規則はありますか?
Python 3.3 の時点で、いくつかの例を次に示します。
bool
function
operator.itemgetter
slice
Cと純粋なPythonの両方で、「最終」クラスの実装を扱う質問を見つけました。
そもそもクラスが「最終」として選択された理由を説明できる理由を理解したいと思います。
Python でクラスが「最終」である理由は 2 つあります。
1. クラス不変条件違反
Singleton パターンに従うクラスには、限定された (事前に決められた) 数のインスタンスがあるという不変条件があります。サブクラスでこの不変条件に違反すると、クラスの意図と矛盾し、正しく機能しなくなります。例:
bool
: True
, False
; Guido のコメントを参照してくださいNoneType
:None
NotImplementedType
:NotImplemented
ellipsis
:Ellipsis
このカテゴリには Singleton パターン以外のケースもあるかもしれませんが、私は知りません。
2.説得力のあるユースケースがない
C で実装されたクラスは、(少なくとも CPython では) サブクラス化を可能にするために追加の作業が必要です。説得力のあるユースケースなしでそのような作業を行うことはあまり魅力的ではないため、ボランティアが名乗り出る可能性は低くなります。例:
function
; Tim Peters の投稿を参照してください注 1:
私はもともと有効なユースケースがあると思っていましたが、 と のサブクラス化には関心がありませんでしfunction
たoperator.itemgetter
。こことここで提供される使用例が説得力がないことを指摘してくれた @agf に感謝します(質問に対する @agf のコメントを参照してください)。
注 2:
私の懸念は、別の Python 実装が誤って CPython で最終的なクラスのサブクラス化を許可する可能性があることです。これにより、移植性のないコードが作成される可能性があります (ユースケースは弱いかもしれませんがfunction
、Python がサポートしている場合はサブクラス化するコードを書く人もいるかもしれません)。これは、サブクラス化できないすべての組み込みおよび標準ライブラリ クラスを Python ドキュメントでマークし、すべての実装がその点で CPython の動作に従うことを要求することで解決できます。
注3:
上記のすべてのケースで CPython によって生成されるメッセージは次のとおりです。
TypeError: type 'bool' is not an acceptable base type
この主題に関する多くの質問が示すように、それは非常に不可解です。最終的なクラスを説明する段落をドキュメントに追加する提案を送信し、エラー メッセージを次のように変更することもできます。
TypeError: type 'bool' is final (non-extensible)