Python Kind nicht mit einem Modul der Übergeordneten Importiert
Habe ich eine lustige import-Fehler bei der Verwendung von Inheritence in Python.
In einer übergeordneten Klasse I import das Modul sqlite3, in einer Kind-Klasse, die ich dann versuchen, eine sqlite3-Funktion, aber ich bekomme eine Fehlermeldung "NameError: global name 'sqlite3' ist nicht definiert". Warum passiert das & wie kann ich es beheben?
Die 2-Klassen werden in separate Dateien:
Parent.py
import sqlite3
class Parent:
def __init__(self):
self.create_database()
def create_database(self):
""" Virtual function to be overriden in child classes """
pass
...more class functions that use sqlite3 functions
Child.py
import Parent
class Child( Parent.Parent ):
def create_database(self):
self.db = sqlite3.connect("test.db") # Error occurs HERE
c = Child()
Du musst angemeldet sein, um einen Kommentar abzugeben.
dem sqlite3 Modul importiert wird, in dem Übergeordneten Modul daher müssen Sie auf Sie durch das Modul
Ist es nicht direkt importiert, in der Kind-Modul, es sei denn, Sie sagen, python zu tun, zum Beispiel
Erhalten Sie Zugriff auf alle Mitglieder der Übergeordnete Modul in das Kind-Modul
import sqlite3
auf das Kind-Modul sowie.import sqlite3
ist der richtige Weg, dies zu tun.Kind hat seinen eigenen Namensraum, und Sie haben nicht importiert sqlite3 hinein. So müssen Sie den import sqlite3 in Child.py. Sie können auch
import Parent.sqlite3
und rufen Sie dannParent.sqlite3.connect
. Es gibt keinen wirklichen Vorteil, es zu tun auf diese Weise anstatt nur den Import sqlite3, da Module eigentlich nur einmal importiert (beim ersten import den code erreicht) und die folgenden imports-fügen Sie einfach das Modul auf den aktuellen namespace.Haben Sie nicht importiert
sqlite3
Modul in derParent
Klasse (Sie könnten, aber das wäre wirklich seltsam). Sie importiert habensqlite3
in dieParent.py
Modul, die auch dieParent
Klasse, und verwendet diesqlite3
Modul in der definition.Dann ein separates Modul importiert die
Parent.py
Modul, und definiert eine Unterklasse vonParent
. Dies bedeutet nicht automatisch alles, was in derParent
Klasse in den Bereich[1], und es ist sicherlich nicht alles bringen, der war in Reichweite, wenn Sie definieren dieParent
KlasseParent.py
in scope. Wenn Sie erklärt anderen Klassen inParent.py
Sie würden nicht erwarten, dass diese Namen im Gültigkeitsbereich inChild
nur, weil Sie in der selben Modul wie der übergeordneten Klasse, also warum würden Sie erwarten, dass dies ein Modul ist, das einfach geschieht, um verwendet werden, definieren einige derParent
's Methoden?Du bereits einen Verweis auf den namespace, in dem
sqlite3
importiert wurde; Sie haben denParent
Klasse aus, um die Unterklasse, wenn Sie sagteclass Child(Parent.Parent)
. Damit Sie könnte VerwendungParent.sqlite3
Zugangsqlite3
, das ist aber eine sehr seltsame Art und Weise zu verwenden, die Module in Python.Normalerweise ist es besser, fügen Sie einfach
import sqlite3
an die Spitze derChild.py
. Dann wer liest den code sehen, dass es verwendetsqlite3
. Wenn die sehen, die Sie mitsqlite3
, die Sie importiert haben ausParent.py
werden, werden Sie sich Fragen, warum Sie nicht verwenden die normale Weise, und denken, Sie könnten etwas tricky, wie das einwickeln dersqlite3
Modul mit einigen zusätzlichen code, den Sie Hinzugefügt haben. Und wenn Sie gerade gemacht habenimport * from Parent
ist, dann ist es auch nicht offensichtlich wo diesqlite3
name stammt, und Ihre Leser wirklich verwirrt zu sein. Und Ihr code wird geheimnisvoll aufhören zu arbeiten, wenn Sie sich entscheiden, Sie brauchen nicht zu importierensqlite3
imParent.py
nachdem alle, aber die Fehlermeldung nicht sagen, nichts überParent.py
.In der Regel, wenn du tust einfachen, offensichtlichen Dinge, wie das importieren von einem standard-Modul, Sie sollten es tun, die einfache und offensichtliche Art und Weise. Leute Lesen das und nehmen es wirklich einfach ohne zu stoppen und denken über es. Die "verwirrte Leser", das ist höchstwahrscheinlich ein problem ist, dich in ein paar Monaten, wenn Sie vergessen haben, genau wie dieser code funktioniert; Sie wollen es so einfach wie möglich für Sie selbst, wenn Sie bekommen die Aufgabe, herauszufinden es wieder heraus.
[1] Erben von einer übergeordneten Klasse hat nichts zu tun mit der Umfang, also was Namen, die Sie zugreifen können, ohne zu Kennzeichnen. Sie nicht bekommen, Zugriff auf die parent-class " - Methoden und Klassenvariablen innerhalb der Klasse block definieren der Kind-Klasse. Was es bedeutet ist, dass nach der Kind-Klasse erstellt, die name resolution-Protokoll für die Instanz-und Klassenvariablen Aussehen wird, in der Eltern, wenn Sie nicht finden, die Dinge in die Kind-Klasse. Dies ist ein etwas subtiler Punkt, dass im Grunde läuft darauf hinaus, (1) innerhalb der Kind-Klasse-block (einschließlich der Definitionen von Methoden)
some_parent_method()
wird Ihnen ein Fehler, aber (2) nach der Kind-Klasse vorhanden ist (auch wenn die Methoden tatsächlich ausgeführt wird)Child.some_parent_method()
(oderself.some_parent_method()
innerhalb einer Methode) wird die übergeordnete Methode.