編集: ああ、申し訳ありません。この質問は、重複したものですが、リンクされたもののdupではありません。私はこの質問に必要なものを見つけました。次回の検索にもっとキーワードを試してください。私の場合はSubclassing dict: should dict.init() be called?この場合、super().__ init __()を使用する必要がありますか?
、私は、クラスStrKeyDict(dict)
で__setitem__
をupdate
を実装し、dict
から継承__new__
がupdate
が働くことができることを確認するために、空のdict
を作成することが、私はそれが再びsuper().__init__()
を使用する必要はないと思います。
1.Call __new__
:
コードは、我々は、インスタンスdを作成するには、例えば
d = StrKeyDict(a=1,b=2)
を使用すると、実際の出来事が流暢のPythonから example-code/attic/dicts/strkeydict_dictsub.py
import collections.abc
class StrKeyDict(dict):
def __init__(self, iterable=None, **kwds):
super().__init__()
self.update(iterable, **kwds)
def __missing__(self, key):
if isinstance(key, str):
raise KeyError(key)
return self[str(key)]
def __contains__(self, key):
return key in self.keys() or str(key) in self.keys()
def __setitem__(self, key, item):
super().__setitem__(str(key), item)
def get(self, key, default=None):
try:
return self[key]
except KeyError:
return default
def update(self, iterable=None, **kwds):
if iterable is not None:
if isinstance(iterable, collections.abc.Mapping):
pairs = iterable.items()
else:
pairs = ((k, v) for k, v in iterable)
for key, value in pairs:
self[key] = value
if kwds:
self.update(kwds)
ですスーパークラスdict
から継承して空を作成するdict
インスタンス
2.Call __init__
私はクラスStrKeyDict(dict)
にupdate
、__setitem__
を実装する、と述べたと同じようにインスタンスに
を初期化します。だからここでsuper().__init__()
を使用する必要があります。 ありがとうございました!
'super().__ init __()'はスーパークラスで '__init __()'を呼び出すのと同じことをします。 –
私は 'class StrKeyDict(dict)'クラスで 'update'、' __setitem__'を実装し、 'dict'から継承した' __new__'は 'update'が動作するように空の' dict'を作成するかもしれないので、 'super().__ init __()'をもう一度使う必要があります。 –
あなたが他の誰よりもよく知っているなら、なぜこの質問をしましたか?特にあなたが誰とでも議論するつもりなら、答えは欲しくなく、あなたは正しいと言いたい、そうではないと言いたい。 –