[解決済み] サブクラス化できないクラスは?
質問
組み込みクラスや標準ライブラリクラスでサブクラス化できないもの ("final") の決まりはありますか?
Python 3.3時点では、以下のような例があります。
-
bool
-
function
-
operator.itemgetter
-
slice
を発見しました。 質問 は、Cと純粋なPythonの両方で、"final" クラスの実装を扱っています。
私は、クラスがそもそも"final"であることが選択される理由を説明するかもしれないものを理解したいと思います。
どのように解決するのですか?
Pythonでクラスが"final"である理由は2つあるようです。
1. クラス不変量の違反
Singletonパターンに従うクラスは、インスタンスの数が限られているという不変性を持っています(事前に決定されています)。サブクラスでこの不変量に違反すると、クラスの意図と矛盾し、正しく動作しなくなります。例を挙げます。
-
bool
:True
,False
参照 グイドのコメント -
NoneType
:None
-
NotImplementedType
:NotImplemented
-
ellipsis
:Ellipsis
このカテゴリにはSingletonパターン以外のケースもありそうですが、私は把握していません。
2. 説得力のある使用事例がない
C言語で実装されたクラスは、(少なくともCPythonでは)サブクラス化を可能にするために追加の作業が必要です。説得力のあるユースケースなしでそのような作業をすることはあまり魅力的ではないので、ボランティアが名乗り出る可能性は低くなります。例を挙げます。
-
function
参照 Tim Petersの投稿
注1:
のサブクラス化には、有効なユースケースがあるが、単に関心が薄いだけだと考えていました。
function
と
operator.itemgetter
. を提供するユースケースであることを指摘してくれた @agf に感謝します。
ここで
と
はこちら
は説得力がありません(質問に対する@agfのコメントを参照してください)。
注2です。
私の懸念は、別のPython実装がCPythonでfinalであるクラスのサブクラス化を誤って許可してしまうかもしれないことです。これは移植性のないコードになるかもしれません(ユースケースは弱いかもしれませんが、それでも誰かが
function
をサブクラス化するコードを書くかもしれません)。これは、Pythonのドキュメントでサブクラス化できないすべての組み込みと標準ライブラリクラスをマークし、すべての実装がその点でCPythonの動作に従うことを要求することで解決することができます。
注3:
上記の全てのケースでCPythonが生成するメッセージは、以下の通りです。
TypeError: type 'bool' is not an acceptable base type
この件に関する多数の質問が示すように、これはかなり不可解です。ドキュメントに final class を説明する段落を追加する提案を提出し、エラーメッセージを変更するのもいいかもしれませんね。
TypeError: type 'bool' is final (non-extensible)
関連
-
[解決済み] Pythonのクラスはなぜオブジェクトを継承するのですか?
-
[解決済み] pandasを使った "大量データ "ワークフロー【終了しました
-
[解決済み] Pythonの旧スタイルのクラスと新スタイルのクラスの違いは何ですか?
-
[解決済み] pipでどのバージョンのパッケージがインストールされているかを調べる
-
[解決済み] Pythonの__future__は何に使うのか、いつ、どのように使うのか、その仕組みについて
-
[解決済み] Pythonにはクラス内に「プライベート」変数がある?
-
[解決済み】Pythonで抽象クラスを作ることは可能か?
-
[解決済み】なぜC#では==と!=の両方を定義しなければならないのか?
-
[解決済み] PILからopenCVフォーマットへの変換
-
[解決済み] タプルのリストを複数のリストに変換するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] DataFrameの文字列、dtypeがobjectの場合
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] 小数点以下1桁を取得する[重複]。
-
[解決済み] Pythonのインスタンス変数とクラス変数
-
[解決済み] なぜ(0-6)は-6=偽なのか?重複
-
[解決済み] 値で列挙名を取得する [重複]。
-
[解決済み] PyMongoで.sortを使用する
-
[解決済み] Python Empty Generator 関数
-
[解決済み] pycharmがタブをスペースに自動変換する
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?