2017-09-02 3 views
1

ich zwei Python-Skripte haben, ein testclass.py:Python - Import-Modul bekommt globale Variablen

import numpy 
zz = numpy 

class Something(object): 
    def __init__(self): 
     self.xp = zz 

und ein testscript.py:

from testclass import Something 
x = Something() 
print(x.xp) 

ich testscript.py erwartet einen Fehler zu werfen weil ich dachte, dass testscript nur die Klasse Something (mit seiner __init__-Methode) importiert, und nicht die globale Variable zz. Angesichts dieses Problems ist meine Frage, ob Python beim Import von einem Modul alles in der Moduldatei "ausführt"?

Antwort

2

Ja. Wenn Sie ausführen:

from testclass import Something 

Es hat die gleiche Wirkung wie:

import testclass 
Something = testclass.Something 

Allgemeiner kann der Python-Interpreter vorher wissen nicht, was Ihr Modul aussetzt Objekte (sofern Sie sie nicht explizit in __all__ nennen) . Für Extremfall ist folgendes zu beachten:

a.py:

import random 

if random.random() > 0.5: 
    class Foo(object): 
     pass 
else: 
    class Bar(object): 
     pass 

Lauf from a import Foo hat eine 50% ige Chance zu scheitern, weil das a Modulobjekt kann oder auch nicht ein Foo Attribut haben.

+0

Ich mag die Idee, zufällige Sachen in einem Modul tief in Ihrem Projekt zu definieren. Den gleichen Namen zu behalten, aber einen anderen MRO, würde für Spaßzeiten sorgen. – spectras

+0

Führt das mehrfache Ausführen von 'aus einem Import-Foo' die Wahrscheinlichkeit eines Fehlers auf? Oder bleibt die definierte Klasse während des Prozesses nach dem ersten Import gleich? –

+0

@ZachGates: Das Modulobjekt wird in 'sys.modules' zwischengespeichert, nachdem es zuerst importiert wurde. – Blender