Python STDメソッド階層コールは文書化されていますか?
-
27-09-2019 - |
質問
Dict "Type"サブクラスで問題が発生しました。私は__iter__メソッドをオーバーライドしましたが、それがiterkeys、キーなどの他の方法に影響を与えると予想しました。彼らは値を取得するために__ite___メソッドを呼び出すと信じていたが、それらは独立して実装されているようで、それらすべてをオーバーライドする必要がある。
これは、他の方法を使用せず、値を個別に取得しないバグまたは意図ですか?
標準のPythonドキュメントの説明には、標準クラスの方法間の呼び出し依存関係の説明にはありませんでした。仕事を昇華させたり、適切な動作にオーバーライドするために必要な方法がオリエンテーションに役立つでしょう。 Pythonベースの種類/クラスの内部に関する補足文書はありますか?
解決
サブクラス Mapping
また MuteableMapping
から コレクションモジュール それ以外の dict
そして、これらすべての方法を無料で入手できます。
最小限のマッピングと無料で入手できるメソッドのいくつかの例を次に示します。
import collections
class MinimalMapping(collections.Mapping):
def __init__(self, *items ):
self.elements = dict(items)
def __getitem__(self, key):
return self.elements[key]
def __len__(self):
return len(self.elements)
def __iter__(self):
return iter(self.elements)
t = MinimalMapping()
print (t.iteritems, t.keys, t.itervalues, t.get)
ビルトインコンテナのいずれかをサブクラスするには、常にコレクションモジュールの適切なベースクラスを使用する必要があります。
他のヒント
ドキュメントで指定されていない場合はそうです 実装固有. 。 cpythonが再利用できる他の実装 iter
実装する方法 iterkeys
その他。私はこれをバグだとは考えていませんが、実装者にとっては少し自由です。
特に辞書がPythonで非常に広く使用されているため、メソッドを独立して実装する際にはパフォーマンス要因があると思います。
したがって、基本的に、それらを実装する必要があります。
あなたは「あなたはあなたが仮定するときに何が起こるか知っている」という言葉を知っています。 :-)
彼らは将来それを変更することを決定するかもしれないので、彼らはそのことを公式に文書化しません。あなたが見つけるかもしれない非公式のドキュメントは、1つのPython実装の現在の動作を単に文書化するだけで、それに依存すると、コードは非常に脆弱になります。
特別な方法の公式文書がある場合、使用するなど、あなた自身のクラスに関して通訳者の行動を説明する傾向があります __len__()
いつ __nonzero__()
実装されていないか、必要なだけです __lt()__
ソート用。
PythonはDuck Typingを使用しているため、通常、組み込みのクラスを組み込みのクラスを継承する必要はありません。したがって、サブクラス化を再考することができます dict
本当にあなたがやりたいことです。からの何かなど、別のクラスを選択する場合があります collections
モジュール、または継承するのではなくカプセル化する。 ( UserString
クラスはカプセル化を使用します。)または単にゼロから開始します。
サブクラス化の代わりに dict
, 、代わりに、独自のクラスを作成するだけで作成できます まさに あまり問題なく必要なプロパティ。これが次のとおりです ブログ これを行う方法の例を投稿してください。 __str__()
その中の方法は最大ではありませんが、それは簡単に修正され、残りはあなたが求める機能を提供します。