2017-10-05 4 views
3

Angesichts der folgenden:Welche impliziten Argumente werden an das Modul __init __() übergeben?

ParentModule.py

class ParentClass(): 
    def __init__(self): 
     pass 

ChildModule.py

class ChildClass(ParentClass): 
    def __init__(self): 
     pass 

Wenn in ChildModule, ich importieren fälschlicherweise das übergeordnete Modul und nicht die übergeordnete Klasse, dh :

import ParentModule 

statt der korrekten

from ParentModule import ParentClass 

ich die folgende Fehlermeldung erhalten:

TypeError: module.__init__() takes at most 2 arguments (3 given) 

Also genau das, was sind diese drei implizite Argumente ParentModule's __init__() bestanden? Was sind die 2 Argumente ParentModule.__init__() erwartet?

Wie nutzt man diese Funktionalität?

+0

füge ich nicht wiedergeben kann. Sind beide Module im selben Verzeichnis? Der einzige Fehler, den ich bekomme, ist: 'NameError: Name 'ParentClass' ist nicht definiert'. –

+0

Ja, die 'ParentClass' und' ParentModule' hatten wahrscheinlich den gleichen Namen im realen Code, oder der echte Code hatte 'class ChildClass (ParentModule)' anstelle von 'class ChildClass (ParentClass)'. – user2357112

+0

@ChristianDean: Ja, die realen Modul-/Klassennamen wären Parent.Parent und Child.Child, aber ich fühlte, dass die Verwendung dieser Terminologie das Problem nicht geklärt hat. Fühlen Sie sich frei, die Frage zu bearbeiten, wenn Sie denken, dass es so klarer wäre. –

Antwort

4

Erstens ist die Fehlermeldung ein wenig irreführend, weil sie das implizite self Argument ignoriert. Es sollte wahrscheinlich takes at most 3 arguments (4 given), unter Berücksichtigung self sagen.

Wenn Sie einen Blick auf den help Ausgang für den Modultyp:

>>> import sys 
>>> help(type(sys)) 

Sie folgenden sehen werden:

Help on class module in module builtins: 

class module(object) 
| module(name[, doc]) 
| 
| Create a module object. 
| ... 

So das des Modultypen __init__ soll nehmen bis zu 3 Argumente: self (nicht aufgeführt), name (der Modulname) und optional doc (der Docstring).


Das ist nicht, was Sie es weitergeben. Wenn Sie versehentlich

tun
import ParentModule 

class ChildClass(ParentModule) 

Python geht davon aus, dass ParentModule eine Klasse mit einem seltsamen Metaklasse ist und verwendet type(ParentModule) zu finden, was die Metaklasse sein sollte. Sie findet den Modultyp und ruft es mit 3 Argumente: der Name ('ChildClass'), die Basen ((ParentModule,)) und die dict der neuen Klasse Sie versuchen, zu erstellen:

type(ParentModule)('ChildClass', (ParentModule,), {'__init__': ..., ...}) 

Daraus ergibt sich ein Aufruf der __init__ des Modultyps mit 4 Argumenten (self an der Vorderseite einfügen), und die __init__ des Modultyps nicht so, also es wirft einen Fehler.


Weitere Lesung über die Einzelheiten der Klassenerstellung finden Sie in der Python data model documentation on metaclasses.

+0

Ausgezeichnete Arbeit! Ich hätte gedacht, help() auf dem Modulobjekt auszuführen. –

0

Wenn Sie das Modul importieren, lädt der Code __init__.py Datei im Modul. wenn Sie init nutzen wollen, zum Beispiel Vorbelastung Module, können Sie Code in __init__.py

model/ 
    __init__.py 
    func1.py 
    func2.py 
Verwandte Themen