2016-03-26 27 views
-1

編集: ああ、申し訳ありません。この質問は、重複したものですが、リンクされたものの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__()を使用する必要があります。 ありがとうございました!

+0

'super().__ init __()'はスーパークラスで '__init __()'を呼び出すのと同じことをします。 –

+0

私は 'class StrKeyDict(dict)'クラスで 'update'、' __setitem__'を実装し、 'dict'から継承した' __new__'は 'update'が動作するように空の' dict'を作成するかもしれないので、 'super().__ init __()'をもう一度使う必要があります。 –

+0

あなたが他の誰よりもよく知っているなら、なぜこの質問をしましたか?特にあなたが誰とでも議論するつもりなら、答えは欲しくなく、あなたは正しいと言いたい、そうではないと言いたい。 –

答えて

1

スーパークラス '__init__()は、それを初期化するために必要な処理をしている場合としない場合があります。あなたが何かを知っているなら、情報に基づいた決定をすることができます。あなたの最善の策がわからない場合は、それをちょうど呼び出すことです。

これは必須ではないため、基本クラスの実装が必要になるように変更されたため、呼び出さなければ修正する必要があります。

一方、スーパークラス__init__()を呼び出すことは悪い考えです。たとえば、スーパークラスに非常に重い計算があり、サブクラスで異なる場合などです。

FWIW私のアプローチは、電話をしないのが正当な理由がない限り、常にsuper().__init__()です。

1

一般に必要です。そして、あなたのinitの最初の呼び出しであることがしばしば必要です。まず、親クラスのinit関数(dict)を呼び出します。 通常は、その基礎となるデータ構造を作成します。

+0

"基礎となるデータ構造を作成する"と言ったことは、 'super()の主な目的は何ですか? ).__ init __() 'を呼び出します。 –

関連する問題