2013-07-25 5 views
9

threadingモジュールでは、RLock,SemaphoreEventなどの名前はすべてファクトリ関数ですが、実装クラス名の前にはアンダースコアが付きます。Pythonスレッドモジュールのクラスが、コンストラクタの代わりにファクトリ関数を公開するのはなぜですか?

ファクトリ関数は、受け取ったすべての引数を基になるコンストラクタに渡します。

これを行う利点は何ですか?

+2

私の推測は遺産です。モジュールはかなり古いです。 –

+0

@MartijnPietersそうですか?私はまだ私のマシンでPython2.7を使用しています。 – satoru

+0

1998年に 'threading'がライブラリに追加されました。私はPythonバージョン1.5.1が最初にそれを含めると思います。 –

答えて

2

本当の利点はありません。

グイドadded the module 1998;最初のリビジョンには既にそれらのファクトリ関数が含まれています。おそらく、彼はおそらく彼がJavaの実装を見て、いくつかのイディオムをコピーしていたかもしれません。おそらく、彼は頭の中でCの再実装とプラガブルにしたいと思っていたのかもしれません。

私達は推測することができ、またはGuidoに直接尋ねることができます。

3

スレッド・シグ・アーカイブはインターネット(*)から消えてしまったようですが、サブクラス化されていないものをサブクラス化しないようにしています。プリミティブが偶然に発生する)、モジュールが追加されたときに新しいスタイルのトリッキーでそれを行うことができないほど古いものです。

RLockには複数の実装クラスがあります。

*)まあ、ギリシャのFTPサーバーに残っているものがいくつか見つかりましたが、元の仕様はありませんでした。

+0

Python(そしてそのライブラリ)はいつ人々が奇妙なことをしないようにしようとしていますか? – glglgl

+0

いつもですか?結局のところ、ソフトウェアなので、「防止する」とは、「不可能にする」ことではなく「少し難しくする」ことを意味します。それを行うための1つの明白な方法 – Fredrik

+0

でも、それはPythonの通常の動作です。例えば、大人のプログラマーはそれらを必要としないため、プライベートクラスや保護されたクラスの属性はありません。 (少なくとも、彼らはそう言っています)。それは非論理的であり、RLockからの継承を防ぐことができません。 YMMV。 – glglgl

関連する問題