私のコメントで示唆したように、collections.MutableMappingを実装できます。
ここには内部辞書を使用した例があります。古典的なdict
または他の辞書のようなクラスを使用できます。
class NewDict(dict):
pass
import collections
class CustomDictionary(collections.MutableMapping):
""" A dictionary which contains only ``NewDict`` values. """
def __init__(self, *args, **kwargs):
self._data = dict() # or collections.OrderedDict, etc.
self.update(*args, **kwargs)
def __iter__(self):
return self._data.__iter__()
def __setitem__(self, key, value):
if not isinstance(value, NewDict):
raise TypeError(repr(type(value)))
self._data.__setitem__(key, value)
def __delitem__(self, key):
self._data.__delitem__(key)
def __getitem__(self, key):
return self._data.__getitem__(key)
def __len__(self):
return self._data.__len__()
Or Duanによって提示されるように、タイプチェックを行うことができます。私はNewDict
というサブクラスのインスタンスを許可するために、isinstance
を使用する方が好きです。
- 長所:
collections.MutableMapping
はそうでget
、update
、setdefault
など、すべての古典的なdict
のメソッドを実装します。
- 短所:この実装では、クラスにいくつかのマジックメソッドを挿入する抽象基本クラスを使用します。しかし、それらは文書化されている。
その後、あなたは他の辞書のように、この辞書を使用することができます:上記の辞書と
def __str__(self):
return self._data.__str__()
__repr__ = __str__
:あなたは、次のメソッドを追加する場合は、値を印刷することができ
custom_dict = CustomDictionary()
custom_dict["key1"] = NewDict()
custom_dict["key1"]["my_key_1"] = 3.14
inner_dict = custom_dict["key2"] = NewDict()
inner_dict["my_key_1"] = 2
inner_dict["my_key_2"] = 4
:
import pprint
pprint.pprint(custom_dict)
入手方法:
{'key2': {'my_key_2': 4, 'my_key_1': 2}, 'key1': {'my_key_1': 3.14}}
NewDictモジュールを表示できますか? – ettanany
あなたは、次の抽象クラス 'collections.MutableMapping'または' collections.Mapping'に実装する必要があります。 –
クラス内のすべての値が 'NewDict'型であることを知っているクラスを定義してください。 (私はあなたが 'CustomDictionary'を意味する"クラス "と仮定します)。 – martineau