Ich bin in diesem Aspekt nicht sehr klar. Angenommen, Sie haben eine Reihe von .py-Dateien, die ihre eigenen separaten Module sind.
Warum muss jede .py-Datei die anderen importieren, wenn sie diese Klasse verwenden? Oder doch? Weil ich mir ziemlich sicher war, dass andere Sprachen (z. B. Java) keinen Import benötigten, wenn auf Klassen / Dateien im selben Verzeichnis verwiesen wurde. Ich könnte falsch liegen.
Da Python interpretiert wird, ist alles, was Sie importieren, an der Eingabeaufforderung verfügbar. Java (und C ++) verfügen über einen Kompilierungs- und Verknüpfungsschritt, der nur verwendete Funktionen suchen und enthalten kann
Wenn alles automatisch importiert würde, gäbe es Tausende von Funktionen und Variablen, und es wäre unmöglich, etwas einzugeben, ohne mit einer zu kollidieren.
edit: Ok, es ist ein bisschen mehr als nur kompiliert oder interpretiert. Python ist als "Batterien enthalten" -Sprache gedacht - es stehen Bibliotheken zur Verfügung, um fast alles zu tun. Da Sie immer nur einen kleinen Teil davon verwenden werden, muss es eine Möglichkeit geben, sie so zu organisieren, dass Sie nur diejenigen einbeziehen, die Sie benötigen.
Der Import aus der Syntax ist clever, da Sie entweder die gesamte Bibliothek importieren und Java-ähnliche, vollständig qualifizierte Namen beibehalten oder bestimmte Funktionen (oder alle Funktionen) in den lokalen Namespace importieren können
Der zweite Grund ist besonders wichtig in einer dynamischen Sprache wie Python. Da Sie keine Variablen definieren müssen, bevor Sie sie verwenden, ist es für die Umgebung schwierig herauszufinden, ob
sin
die mathematische Funktion oder eine Ihrer Variablen in einem Interpreter vorhanden ist.quelle
Stellen Sie sich vor, Sie hätten diesen Code in Python:
Offensichtlich haben wir einen Tippfehler und
fo
hätten es tun sollenfoo
. Im Moment sagt Python:Aber beim impliziten Laden von Klassen könnte es heißen:
das wäre verwirrend. Schlimmer noch, wenn Sie einen Variablennamen falsch geschrieben haben, der zufällig der Name eines Moduls ist, wird ein noch verwirrenderer Fehler angezeigt, wenn Sie versuchen, dieses Modul so zu behandeln, als wäre es Ihre Variable. Python kann nicht sagen, ob etwas ein Klassenname, ein Objekt oder was auch immer ist.
Java hingegen kann meiner Meinung nach anhand der Syntax erkennen, ob sich ein bestimmter Bezeichner auf eine Klasse oder etwas anderes bezieht. Somit ist es kein Problem, eine entsprechende Fehlermeldung zu erzeugen.
Insgesamt passt es in die Python-Philosophie, eher explizit als implizit zu sein. Sie finden es besser, ein Modul explizit zu importieren, als es automatisch importieren zu lassen. Das Problem der Fehlermeldung ist ein Faktor, der bei der Entscheidung eine Rolle spielt.
Einige haben vorgeschlagen, dass implizite Importe hohe Laufzeitkosten verursachen würden. Das glaube ich nicht. Was passiert, ist ungefähr so:
Um das implizite Laden von Modulen zu unterstützen, können wir Folgendes tun:
import foo
Bei der ersten Verwendung des Moduls dauert es etwas länger, da zuerst andere Wörterbücher durchsucht werden müssen. Dies ist jedoch nur das erste Mal und sollte für die gesamte Programmlaufzeit nicht von Bedeutung sein.
Bei falsch geschriebenen Variablennamen würden erhebliche Kosten entstehen. Wenn sie auftreten, verschwendet Python Zeit damit, die Festplatte zu lesen und zu versuchen, das Modul zu finden. Aber wenn das passiert, wird Ihr Programm sowieso mit einem Traceback sterben und die Leistung ist kein großes Problem.
quelle
Es gibt einige wichtige Unterschiede zwischen Python und Java. Während Java eine Regel "eine Klasse pro Datei" hat, tut dies Python nicht. Außerdem ist nicht alles in Python eine Klasse.
Ein Modul kann also Klassen, Funktionen und einfach nur alte Variablen enthalten - normalerweise alle in irgendeiner Weise miteinander verbunden (z. B. Zufallsfunktionen in
random
, mathematische Routinen inmath
, Zeichenfolgenkonstanten instring
usw.).Wenn Sie von einem bestimmten Modul aus auf Klassen / Funktionen / Variablen zugreifen möchten, müssen Sie diese zuerst importieren.
Warum ist das eine gute Sache?
math.sin
und Ihre eigenensin
Funktionen haben).quelle
Eines der wichtigsten Konzepte in Python ist das von Namespaces (machen Sie
import this
an der Eingabeaufforderung einige Zeit, um herauszufinden, was die anderen sind). Ich weiß, dass Namespaces auch in anderen Sprachen existieren, aber in Python haben Sie nur Zugriff auf den aktuellen Namespace, der im aktuellen Modul definiert ist. Um Zugriff auf andere Bezeichner zu erhalten, müssen Sie diese in den aktuellen Namespace importieren: entweder durch Importieren des enthaltenen Moduls (derimport foo
Syntax) oder der Namen selbst (from foo import bar
).quelle