Ich bin etwas verwirrt über das Importieren von Methoden aus einer anderen Datei.

Ich schreibe ein Python-Skript, das aus python-automata importiert wird. Ich habe die Datei heruntergeladen und in meinem ../Python/ Verzeichnis habe ich DFA.py und myfile.py gespeichert.

In myfile.py habe ich dies oben geschrieben:

import DFA

Da ich den Anweisungen im Python-Tutorial folge, gehe ich davon aus, dass in {{ X0}} Ich kann jede in DFA.py definierte Methode verwenden. Diese Datei hat eine Methode namens __init__, die 5 Argumente akzeptiert und ein DFA initialisiert. Dann schreibe ich dies in myfile.py:

DFA.__init__(states, alphabet, delta(states, alphabet), start, accepts)       

Wobei Zustände, Alphabet, Delta, Start und Akzeptieren alle grundlegenden Listen / Funktionen sind, die ich in myfile.py initialisiert habe.

Wenn ich dann versuche, myfile.py auszuführen, wird folgende Fehlermeldung angezeigt:

Traceback (most recent call last):
  File "myfile.py", line 21, in <module>
    DFA.__init__(states, alphabet, delta(states, alphabet), start, accepts)
TypeError: module.__init__() takes at most 2 arguments (5 given)

Ich bin nicht sicher, warum es sagt, dass es 2 Argumente braucht, wenn DFA.py definiert, dass es 5 Argumente akzeptiert. In DFA.py sehe ich:

class DFA:
    def __init__(self, states, alphabet, delta, start, accepts):
    ...

Es scheint ein ähnlicher Fehler zu sein, auf den ich zuvor gestoßen bin (siehe Python-Importproblem und Python-Klassen und __init__ -Methode), aber ich glaube nicht, dass ich mich hier mit Vererbung befassen muss.

0
TakeS 8 Okt. 2012 im 20:43

3 Antworten

Beste Antwort
from DFA import DFA

a = DFA(states, alphabet, delta(states, alphabet), start, accepts)

BEARBEITEN: Methoden mit dem Namen __xx__ sollen nicht direkt aufgerufen werden.

Lesen Sie etwas: http://docs.python.org/tutorial/classes.html

5
user180100user180100 8 Okt. 2012 im 16:45

Sie importieren DFA als Modul, möchten aber stattdessen die darin enthaltene -Klasse importieren. Versuchen:

from DFA import DFA

Sie können dann implizit __init__ aufrufen, indem Sie den Konstruktor für Ihre DFA -Klasse aufrufen:

DFA(states, alphabet, delta(states, alphabet), start, accepts)     
# ^ this calls __init__ on DFA
4
Peter Sobot 8 Okt. 2012 im 16:51

Wenn Sie DFA.__init__() eingeben, rufen Sie die Methode __init__ für das gesamte Modul auf (ich weiß nicht einmal, wie das definiert ist). Sie sollten DFA.DFA.__init__() verwenden, das sich auf die __init__ -Methode der DFA -Klasse in DFA.py bezieht, oder Folgendes verwenden:

from DFA import *
DFA.__init__()
0
Martijn Pieters 8 Okt. 2012 im 16:53