2016-08-01 6 views
3

私はいくつかのコードをオンラインで読んでおり、次のクラス定義に出くわしました。私はちょっと混乱しています。__init__メソッドがないときに、このコードがコンストラクタにパラメータを渡すのはなぜですか?

class MyClass(OrderedDict): 
    def __hash__(self): 
     return hash(tuple(self.iteritems())) 

その他のコードには次の行があります。

MyClass(my_OD) 

ここで、my_ODは順序付き辞書です。私の質問は、__init__メソッドがない場合、どのようにこのクラスに引数を渡すことができますか?この変数はクラス内でどこに割り当てられていますか?私はJavaから来ており、Javaでは、コンストラクタなしでクラスに引数を渡すことができないので、この動作は私にとっては外国のものです。 OrderedDictから

答えて

6

クラスMyClass継承:MyClassが指定__init__方法がないため

class MyClass(OrderedDict): 

、それはOrderedDictクラスのinitメソッドを呼び出します。そのため、コンストラクタのmy_OD引数がOrderedDictに渡されます。 Btw、__init__は、技術的にコンストラクタではありませんです。

このMyClassの目的は、OrderedDictとは異なる方法でインスタンスのhashを計算するOrderedDictです。具体的には、OrderedDictには__hash__がありません。これはdictで定義されています。その場合、ハッシュはNoneと定義されています。したがって、dictsはハッシュできません。 MyClassの変更はハッシュを取得する方法を追加し、残りの機能は同じOrderedDictdictです。

+0

これは、なぜあなたが 'self'(MyClassオブジェクト)でiteritems()を呼び出せるのかを説明します。 – BlaqICE

+0

はい、 'iteritems'は' dict'オブジェクトのメソッドであり、OrderedDictは 'dict'を継承しますので、' MyClass.iteritems'は実際に 'dict.iteritems'を呼び出します。 – aneroid

関連する問題