Python: access-Objekte aus einem anderen Modul
Ich bin ein sehr unerfahrener Programmierer, ein Spiel zu schaffen (mit Python-3.3) als Lernübung. Ich habe derzeit ein Hauptmodul und ein combat-Modul.
Den Menschen im Spiel sind, repräsentiert durch Instanzen der Klasse "Person", und sind in der main-Modul. Jedoch ist die combat-Modul muss natürlich der Zugriff auf diese Objekte. Außerdem bin ich wahrscheinlich zu erstellen, weitere Module später auch brauchen, den Zugriff auf diese Objekte.
Wie kann ich zulassen, dass andere Module Zugriff auf die Personen, die von main.py?
Stand der Dinge ist, main.py hat
import combat
oben; hinzufügen
import main
zu combat.py scheint nicht zu helfen.
Sollte instanziieren ich meine Objekte in einem separaten Modul (common.py?) und importieren Sie Sie auf jedes Modul zugreifen muss?
InformationsquelleAutor henrebotha | 2013-03-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Sie sollten auf jeden Fall Faktor. Was Sie versucht ist kreisförmig Importe zwischen Ihren Modulen, und das kann sehr problematisch sein. Wenn
combat
Importemain
undmain
Importecombat
, dann erhalten Sie möglicherweise eine Ausnahme, weilmain
wird nicht beendet, wenncombat
beginnt mit der Ausführung, die für den import. Vorausgesetztmain
ist Ihr start-up-Skript, sollte es wohl auch nichts mehr tun, als Instanziierung einer Klasse oder aufrufen einer Methode von einem anderen Modul. Vermeiden Sie Globale Variablen, zu. Auch wenn es nicht so scheint, Sie werden ein problem nun, das kann sich beißen Sie in den Hintern später auf.Dieser sagte, können Sie auf die Mitglieder ein Modul in etwa so:
oder
Persönlich, ich in der Regel vermeiden, verweisen auf eine Methode aus einem anderen Modul ohne qualifizierenden es mit dem Modul-Namen, aber das ist auch legal:
Ich in der Regel verwenden
from ... import ...
für Klassen, und ich verwenden in der Regel die erste form für Methoden. (Ja, dies manchmal bedeutet, dass ich bestimmte Klasse Einfuhren aus einem Modul neben dem Import der Modul selbst.) Das ist aber nur meine persönliche Konvention.Eine Alternative syntax, die stark abgeraten wird
Diese importieren jedes Mitglied des gemeinsamen in den aktuellen Bereich, der nicht mit einem Unterstrich beginnen (
_
). Ich es ist aus dem Grund abgeraten, weil es macht das Verständnis der Quelle der name und macht es brechen die Dinge zu einfach. Betrachten Sie dieses paar Importe:Welches Modul macht
SomeClass
kommen? Es gibt keine Möglichkeit zu sagen, als geh mal auf die beiden Module. Schlimmer noch, was, wenn beide Module definierenSomeClass
oderSomeClass
ist später Hinzugefügtsome_other_module
?Du bist herzlich willkommen. Wenn eine Antwort angeboten, die von jemandem beantwortet Sie die Frage, markieren Sie es als Antwort, indem Sie auf das Häkchen unterhalb der up/down-vote-buttons.
InformationsquelleAutor jpmc26
wenn Sie importiert haben, Hauptmodul in
combat
- Modul mitimport main
, dann sollten Sie main.*(Sachen, die implementiert sind, sind im Haupt-Modul), um Zugriff auf die Klassen und Methoden gibt.Beispiel:
du kannst auch
from main import *
oderimport Person
zu vermeiden, main.* in der vorherigen.Gibt es einige Regeln für die Module zu importieren, wie beschrieben, in http://effbot.org/zone/import-confusion.htm :
import X
importiert das Modul X, und erstellt einen Verweis auf dasmodule in den aktuellen namespace. Oder in anderen Worten, nachdem Sie ausgeführt haben
diese Anweisung, die Sie verwenden können
X.name
zu finden, um Dinge definiertModul X.
from X import *
importiert das Modul X, und schafft Referenzender aktuelle namespace für alle öffentlichen Objekte, definiert durch das Modul
(das ist alles, was nicht mit einem Namen beginnend mit "_"). Oder
in anderen Worten, nachdem Sie diese Anweisung ausführen, können Sie einfach
ein Klartext-name, der zum verweisen auf Sachen definiert in Modul X. Aber X selbst ist
nicht definiert, so
X.name
funktioniert nicht. Und wenn name bereitsdefiniert ist es durch die neue version ersetzt. Und wenn der name in X ist
geändert zeigen Sie auf ein anderes Objekt, dass Ihr Modul nicht bemerkt wird.
from X import a, b, c
importiert das Modul X, und schafft Referenzenin den aktuellen namespace zu der angegebenen Objekte. Oder in anderen Worten,
Sie können jetzt
a
undb
undc
in Ihrem Programm.Schließlich
X = __import__(‘X’)
funktioniert wieimport X
mit derUnterschied, dass Sie
1) übergeben Sie den Namen des Moduls als Zeichenkette, und
2) explizit zuweisen einer variable in Ihrem aktuellen namespace.
Bitte nicht schlagen
from X import *
InformationsquelleAutor user2121529