Das Problem ist, dass, wenn Sie zu tun -
from a import Real, Fake
Sie importieren grundsätzlich diese beiden Klassen in Ihren initialize
Skript Namensraum und die Schaffung von Real
und Fake
Namen in der initialize
Skript Namespace . Dann machen Sie den Namen Real
in initialize
Skriptpunkt auf Fake
, aber das ändert nichts in der tatsächlichen a
Modul.
Wenn initialize
Skript ist ein weiterer .py
Modul/script bei Läufen am Anfang des ursprünglichen Programms, dann können Sie die unten verwenden -
if env == 'dev':
import a
a.Real = a.Fake
Bitte beachten Sie, dies würde a.Real
machen auf die Fake
Klasse beziehen Wann immer Sie Real
von a
Modul verwenden, nachdem die obige Zeile ausgeführt wird.
Obwohl ich würde vorschlagen, dass ein besserer Weg, dies selbst in Ihrem a
Modul zu tun wäre, indem sie es möglich, die env
in diesem Modul zu prüfen, wie -
if <someothermodule>.env == 'dev':
Real = Fake
Wie in den Kommentaren gefragt wurde -
importiert nicht auch ein Import in Skript Namespace initialisieren? Was ist der Unterschied zwischen dem Importieren von Modulen und Klassen?
Die Sache ist die, dass, wenn importieren Sie einfach die Klasse mit from a import class
, was Sie eigentlich tun, ist diese Variable erstellen, class
in Ihrem Modul Namensraum (in dem Modul, das Sie es zu importieren), diese Variable zu ändern, um zu zeigen Etwas Neues in diesem Modul-Namespace hat keine Auswirkungen auf die ursprüngliche Klasse in ihrem ursprünglichen Modul-Objekt, sondern nur auf das Modul, in dem sich das Modul geändert hat.
Aber wenn man import a
tun, die Sie importieren, nur das Modul a
(und während das Modul-Objekt importieren auch im sys.modules
Wörterbuch zwischengespeichert wird, so dass alle anderen Importe a
von anderen Modulen würde diese im Cache gespeicherte Version von sys.modules
erhalten) (Eine weitere Anmerkung ist, dass from a import something
auch intern importiert a
und speichert es in sys.modules
, aber lassen Sie uns nicht in diese Details kommen, wie ich denke, dass hier nicht notwendig ist).
Und dann, wenn Sie a.Real = <something>
tun, ändern Sie das Real
Attribut a
Modul-Objekt, das auf die Klasse verweist, auf etwas anderes, das mutiert das a
Modul direkt, damit die Änderung auch reflektiert wird, wenn das Modul a
wird von einem anderen Modul importiert.
Was ist dieses Initialisierungsskript, es ist ein anderes '.py', das am Anfang Ihres ursprünglichen Programms läuft? –
Ja, es ist eine Django-App, also ist das Init-Skript in app.py, ich habe das nicht erwähnt, um generisch zu sein. –