1

dictの「type」サブクラス化で問題が発生しました。私は__iter__メソッドをオーバーライドし、値を取得するために__iter__メソッドを呼び出すと信じていたため、iterkeys、keysなどの他のメソッドに影響を与えると予想しましたが、それらは独立して実装されているようで、すべてをオーバーライドする必要があります。

これは、他のメソッドを使用せず、値を個別に取得するバグまたは意図ですか?

標準クラスのメソッド間の呼び出しの依存関係に関する標準のPythonドキュメントの説明には見つかりませんでした。サブレーザー作業やオリエンテーションには、適切な動作のためにオーバーライドする必要のあるメソッドが便利です。Pythonの基本タイプ/クラスの内部に関する補足ドキュメントはありますか?

4

4 に答える 4

5

代わりにサブクラス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)

組み込みコンテナのいずれかをサブクラス化するには、コレクションモジュールの適切なベースクラスを常に使用する必要があります。

于 2010-10-29T16:15:18.967 に答える
2

ドキュメントで指定されていない場合は、実装固有です。iterCPython以外の実装では、メソッドを再利用して実装する可能性がiterkeysあります。私はこれをバグとは見なしませんが、実装者にとっては少し自由です。

特に辞書はPythonで非常に広く使用されているため、メソッドを個別に実装することにはパフォーマンス要因があると思います。

したがって、基本的には、それらを実装する必要があります。

于 2010-10-29T16:14:07.350 に答える
1

あなたはことわざを知っています:「あなたはあなたが仮定したときに何が起こるかを知っています。」:-)

彼らは将来それを変更することを決定するかもしれないので、彼らはそれらのものを公式に文書化しません。非公式のドキュメントは、1つのPython実装の現在の動作を単にドキュメント化するだけであり、それに依存すると、コードが非常に壊れやすくなります。

特別なメソッドの公式ドキュメントがある場合、実装されていない__len__()場合の使用や、並べ替えのみが必要な場合など、独自のクラスに関するインタープリターの動作を説明する傾向があります。__nonzero__()__lt()__

Pythonはダックタイピングを使用するため、通常、独自のクラスを1つのように動作させるために、組み込みのクラスから実際に継承する必要はありません。dictしたがって、サブクラス化が本当にやりたいことであるかどうかを再考するかもしれません。モジュールから何かなど、別のクラスを選択したり、collections継承するのではなくカプセル化することもできます。(UserStringクラスはカプセル化を使用します。)または、最初から始めます。

于 2010-10-29T16:19:12.480 に答える
0

サブクラス化する代わりに、必要なプロパティを正確dictに持つ独自のクラスを作成するだけで、それほど問題は発生しません。これを行う方法の例を含むブログ投稿があります。その中の方法は最高ではありませんが、それは簡単に修正され、残りはあなたが求める機能を提供します。__str__()

于 2010-10-29T19:15:46.793 に答える