2016-08-01 5 views
3

Also, ich lese etwas Code online und ich stieß auf die folgende Klassendefinition und ich bin ein wenig verwirrt;Warum übergibt dieser Code einen Parameter an einen Konstruktor, wenn keine Methode __init__ vorhanden ist?

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

Anderswo im Code gibt es die folgende Zeile;

MyClass(my_OD) 

Wobei my_OD ein geordnetes Wörterbuch ist. Meine Frage ist, wie können Sie ein Argument an diese Klasse weitergeben, wenn es keine __init__ Methode gibt? Wo wird diese Variable innerhalb der Klasse zugewiesen? Ich komme aus Java und ich bin ziemlich sicher, dass Sie in Java kein Argument ohne Konstruktor an eine Klasse übergeben können, daher ist dieses Verhalten mir fremd.

Antwort

6

Die Klasse MyClass erbt von OrderedDict:

class MyClass(OrderedDict): 

Da MyClass nicht über eine __init__ Methode angegeben, ruft die init-Methode der OrderedDict Klasse. Das Argument my_OD für den Konstruktor wird an OrderedDict übergeben. Btw, __init__ ist technisch nicht der Konstruktor.

Der Zweck dieser MyClass ist eine OrderedDict, die die hash ihrer Instanzen auf eine andere Weise als OrderedDict berechnet. Insbesondere hat OrderedDict keine __hash__, die auf dict s definiert ist und in diesem Fall ist der Hash als None definiert - so dicts sind nicht-hashable. MyClass Änderungen, die einen Weg hinzufügen, um den Hash zu erhalten, während der Rest der Funktionalität die gleichen OrderedDict s und dict s ist.

+0

Das würde erklären, warum Sie iteritems() auf 'self' aufrufen können - ein MyClass-Objekt? – BlaqICE

+0

Ja, 'iteritems' ist eine Methode für' dict' Objekte und OrderedDict erbt von 'dict', so dass' MyClass.iteritems' tatsächlich 'dict.iteritems' aufruft. – aneroid

Verwandte Themen