6

(私はpython 2.7を使用しています)pythonのドキュメントには、組み込みのdictにマッピングを渡すことができ、そのマッピングを新しいdictにコピーすることが示されています。

http://docs.python.org/library/stdtypes.html#mapping-types-dict

マッピングABCを実装するクラスがありますが、失敗します。

import collections
class Mapping(object):
    def __init__(self, dict={}): self.dict=dict
    def __iter__(self): return iter(self.dict)
    def __iter__(self): return iter(self.dict)
    def __len__(self): return len(self.dict)
    def __contains__(self, value): return value in self.dict
    def __getitem__(self, name): return self.dict[name]

m=Mapping({5:5})
dict(m)
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: cannot convert dictionary update sequence element #0 to a sequence
collections.Mapping.register(Mapping)
dict(m)
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: cannot convert dictionary update sequence element #0 to a sequence

ただし、私のクラスがcollections.Mappingをサブクラス化する場合は、正常に機能します。

import collections
class Mapping(collections.Mapping):
    def __init__(self, dict={}): self.dict=dict
    def __iter__(self): return iter(self.dict)
    def __iter__(self): return iter(self.dict)
    def __len__(self): return len(self.dict)
    def __contains__(self, value): return value in self.dict
    def __getitem__(self, name): return self.dict[name]

m=Mapping({5:5})
dict(m)
# {5: 5}

ABCの要点は、登録がサブクラス化と同じように機能することを許可することだと思いました(とにかくisinstanceとissubclassの場合)。では、ここで何が起こっているのでしょうか。

4

2 に答える 2

11

登録では、定義したものの上に実装された「欠落しているメソッド」は提供されません。実際、登録は、登録するタイプに関して非侵襲的です。登録には何も追加されず、何も削除されず、何も変更されません。 。影響を与えてチェックするだけです。それ以上でもそれ以下でもありません。isinstanceissubclass

ABCをサブクラス化すると、自分で定義する必要のあるメソッドに加えて、ABCによって「無料で」実装された多くのメソッドが提供されます。

サブクラス化のようにクラスを強化することを目的とした操作のセマンティクスと比較して、登録のように完全に非侵襲的な操作のセマンティクスは、明らかに同一にすることはできません。したがって、「ABCの全体的なポイント」の理解は不完全です。ABCには2つのポイントがあり、1つはサブクラス化(「侵襲的」)によって、もう1つは登録(非侵襲的)によって取得されます。

元のクラスのようなクラスがすでにある場合は、いつでも乗算継承できることに注意してくださいMapping:から直接class GoogMapping(Mapping, collections.Mapping): ...継承するのと同じ結果が得られます-すべての補助メソッドが追加され新しいタイプ。Mappingcollections.Mappingcollections.Mapping

于 2010-08-02T22:51:40.180 に答える
0

ああ、dict()がkeysメソッドを探しているようです...ABCを使用していません。

于 2010-08-02T23:04:22.523 に答える