問題タブ [python-datamodel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 無限シーケンスとして機能するオブジェクトの __len__ の適切な戻り値
不変の無限シーケンスとして機能する python クラスを作成しています。
このクラスは、ジェネレータを使用してこの無限シーケンスにアクセスするのではなく、メソッド内のアルゴリズムに従って、シーケンス内の任意のインデックスの値を生成します__getitem__
。
__len__
そのようなオブジェクトのメソッドを処理する最良の方法は何なのか興味があります。理想的には、私はそのまま戻っfloat("inf")
てき__len__
ます。ただし、バックグラウンドでlen()
オブジェクトのメソッドを呼び出す関数には、ある程度特定の値が必要です。__len__
__len__
float("inf") または decimal.Decimal("Infinity") を返すように設定されている場合len()
、TypeError を発生させて拒否します。また、シーケンスが無限であることを意味する "-1" の値も拒否します。さらに、たまたま以前に書いた無限クラスを使ってみたところ、実際にはから継承されint
、len()
何らかの理由で 0 が返されました。
値を「0」にすることは大きな不便ではありませんが、このようなクラスは非常に珍しいものですが、クラスの長さ属性を処理する良い方法はありますか?それは無限のシーケンスですか?
python - 実装されていない __init__()
関数のスペルが間違っているコードを調べて__init__()
いました (アンダーバーが 4 つではなく合計 3 つありました)。そして、オブジェクトが適切な__init__()
.
自動的に挿入されるデフォルトの初期化子はありますか? __new__
呼び出されるデフォルトはありますか? 引数を持つコンストラクターが失敗するのはなぜですか?
python - Counter の __init__ メソッドが記述子と呼ばれるのはなぜですか?
私は Counter クラスの __init__ メソッドを読んでいて、これを見ました:
記述子が何を意味するのかわからなかったので、Pythonデータモデルのドキュメントを確認したところ、次のことがわかりました。
一般に、記述子は「バインディング動作」を持つオブジェクト属性であり、その属性アクセスは記述子プロトコルのメソッドによってオーバーライドされています: __get__()、__set__()、および __delete__()。これらのメソッドのいずれかがオブジェクトに対して定義されている場合、それは記述子と呼ばれます。
これらのメソッドはいずれもクラス定義に存在しないようですが、なぜ __init_ は記述子と呼ばれるのでしょうか?
python - Python - クラス __hash__ メソッドとセット
クラスのメソッドを使用してset()
、セットに同じハッシュ オブジェクトを追加しないようにしています。python data-model documentによると、同じハッシュオブジェクトを同じオブジェクトと見なし、それらを一度追加するだけです。__hash__
python
set()
ただし、次のように動作が異なります。
文字列値の場合は正しく動作します。
私の質問は、なぜ同じハッシュオブジェクトがセット内で同じでないのですか?
python - サブクラスの Python マジック メソッドを「未定義」にするにはどうすればよいですか?
クラスがその親クラスがサポートするいくつかの操作をサポートしていないことを示す方法が Python 3 にありますか?* クラスが に設定__hash__
しNone
て、型がハッシュ不可能であることを示すことができることは知っていますが、これは一般的には機能しないようです。
たとえば、__len__
メソッドを持つコレクション クラスがあり、サイズが定義されていない無制限のコレクションを表す子クラスを作成したいとします。サブクラスに設定__len__
するNone
と、コレクションの長さを取得しようとすると、醜い/混乱するエラーメッセージが表示されます。
D
まったく定義されていないかのようにエラーが発生したいと思い__len__
ます。
この質問は関連していますが、私の質問は特にマジックメソッド/演算子のオーバーロードに関するものです。Python のマジック メソッドはオブジェクトの型で直接検索されるため、オーバーライド__getattribute__
や記述子の使用などのいくつかの可能なアプローチは、ここでは機能しません。
*注: これがLiskov の置換原則に違反することはわかっていますが、型の安全性が必要な場合は、そもそも Python を使用していません。;)