特に、ユーザーが新しい属性を動的に作成できないようにすることで、Python クラスの動的性を低下させる方法について読んでいます。オーバーロード__setattr__
はこれを行う良い方法であり、進むべき道で__slots__
はないことを読みました。この最後のスレッドの1 つの投稿は、__slots__
ピクルス化を中断する可能性があることを実際に示唆しています。(誰かこれを確認できますか?)
ただし、Python 2.2 の whatsnew を読んだだけで、属性アクセス セクション__slots__
では、他の人が提案したような最適化のためだけでなく、属性の作成を制限する目的で使用することを実際に提案しています。Python の歴史に関して言えば、Python の当初の意図を知っている人はい__slots__
ますか? 変数の作成を制限することは、悪用される機能またはバグですか? 人々は実際にどのように__slots__
使用されてきましたか? __setattr__
属性の作成を制限するためにオーバーロードされているのを多くの人が見たことがありますか? どれが一番いいですか?いずれかの方法に精通している場合は、知っている方法の長所と短所を自由に投稿してください. また、問題を解決する別の方法がある場合は、共有してください! (そして、そのマイナス面を繰り返さないようにしてください__slots__
他のスレッドで表現されています。)
編集:「なぜ?」の議論を避けたいと思っていましたが、最初の回答はこれが発生することを示しているので、ここに記載します。問題のプロジェクトでは、これらのクラスを使用して「構成情報」を保存し、ユーザーが (ユーザーの) パラメータを使用してオブジェクトに属性を設定し、オブジェクトをプログラムの別の部分に渡すことができるようにします。オブジェクトはパラメーターを格納するだけではないため、辞書は機能しません。ユーザーが誤って属性名を間違って入力し、プログラムが期待する属性の 1 つを設定するのではなく、新しい属性を作成してしまうという事例が既に発生しています。これは検出されないため、ユーザーはパラメーターを設定していると思いますが、期待される結果が表示されません。これはユーザーを混乱させ、見つけにくいものです。
EDIT 2, re pickling: これらのオブジェクトは、将来保存したいものになるでしょう。明らかに最善の解決策である場合__slots__
、おそらく別の保存方法を見つけることができますが、酸洗いは間違いなく価値があり、考慮に入れておく必要があります.
EDIT 3:メモリの節約は問題ではないことにも言及する必要があります。これらのオブジェクトはほとんど作成されないため、節約されるメモリはごくわずかです (3 ~ 12 GB のマシンで数十キロバイトのように)。