Ausführliche Erläuterung der Unterschiede zwischen import, reload und __import__ in Python

黄舟
Freigeben: 2017-10-16 11:04:24
Original
1527 Leute haben es durchsucht

In diesem Artikel wird hauptsächlich der Unterschied zwischen import reload __import__ in Python vorgestellt. Freunde, die es benötigen, können sich auf

import

Funktion: Importieren/Einführen eines Python-Standardmoduls, einschließlich .py-Dateien und Verzeichnissen mit __init__.py-Dateien (benutzerdefinierte Module).


import module_name[,module1,...] 
from module import *|child[,child1,...]
Nach dem Login kopieren
Hinweis: Wenn die Importanweisung mehrmals verwendet wird, wird das angegebene Modul nicht neu geladen, sondern die Speicheradresse des Moduls wird auf die lokale Adresse verwiesen Variable Umgebung.

Beispiel:

pythontab.py


#!/usr/bin/env python  
#encoding: utf-8 
import os 
print 'in pythontab',id(os)
Nach dem Login kopieren
Nach dem Login kopieren
test.py


#!/usr/bin/env python  
#encoding: utf-8 
import pythontab  #第一次会打印pythontab里面的语句 
import os #再次导入os后,其内存地址和pythontab里面的是一样的,因此这里只是对os的本地引用 
print 'in c',id(os) 
import pythontab #第二次不会打印pythontab里面的语句,因为没有重新加载
Nach dem Login kopieren
Neuladen

Funktion: Ein bereits geladenes Modul neu laden. Wird im Allgemeinen in Sondersituationen verwendet, z. B. bei Änderungen im Originalmodul. Das Modul muss vor dem Neuladen importiert worden sein.


import os
reload(os)
Nach dem Login kopieren
Hinweis:

reload lädt das geladene Modul neu, aber die ursprüngliche Instanz verwendet weiterhin das alte Modul und das neue weiterhin Verwenden Sie das alte Modul. Die ursprüngliche Speicheradresse wird nach dem Neuladen nicht unterstützt. . Import. . Formatmodul wird neu geladen.

Beispiel:

pythontab.py


#!/usr/bin/env python  
#encoding: utf-8 
import os 
print 'in pythontab',id(os)
Nach dem Login kopieren
Nach dem Login kopieren
test.py


#!/usr/bin/env python  
#encoding: utf-8 
import pythontab  #第一次import会打印pythontab里面的语句 
print id(pythontab) #原来pythontab的内存地址 
reload(pythontab) #第二次reload还会打印pythontab里面的语句,因为有重新加载 
print id(pythontab) #reload后pythontab的内存地址,和原来一样
Nach dem Login kopieren
Erweiterung:

Wie oben erwähnt, wird die Neuladefunktion nur unter besonderen Umständen verwendet; in welchen anderen Situationen ist die Verwendung der Neuladefunktion erforderlich? Hier ist ein Beispielbeispiel.


#!/usr/bin/env python  
#encoding: utf-8 
import sys  #引用sys模块进来,并不是进行sys的第一次加载 
reload(sys) #重新加载sys 
sys.setdefaultencoding('utf8') ##调用setdefaultencoding函数
Nach dem Login kopieren
Der obige Code ist korrekt, dann testen Sie den folgenden Code


#!/usr/bin/env python  
#encoding: utf-8 
import sys   
sys.setdefaultencoding('utf8')
Nach dem Login kopieren
Der obige Code Der Test schlägt fehl. Warum müssen wir also zuerst das Systemmodul neu laden, wenn wir setdefaultencoding aufrufen? Da es sich bei der Importanweisung hier nicht um die erste Importanweisung von sys handelt, handelt es sich möglicherweise tatsächlich um den zweiten oder dritten Import des sys-Moduls. Dies ist nur ein Verweis auf sys und kann nur durch erneutes Laden neu geladen werden. Warum muss es dann neu geladen werden, die Funktion kann jedoch nicht aufgerufen werden, wenn direkt darauf verwiesen wird? Da die Funktion setdefaultencoding nach dem Aufruf durch das System gelöscht wird, ist sie nicht mehr vorhanden, wenn sie durch den Import referenziert wird. Daher muss das sys-Modul einmal neu geladen werden, damit setdefaultencoding verfügbar ist und die aktuelle Zeichenkodierung des Interpreters verfügbar ist im Code geändert. Probieren Sie den folgenden Code aus, derselbe Fehler wird gemeldet:


#!/usr/bin/env python  
#encoding: utf-8 
import sys  
reload(sys)  
sys.setdefaultencoding('utf8')  
del sys.setdefaultencoding  ##删除原来的setdefaultencoding函数   
sys.setdefaultencoding('gb2312')
Nach dem Login kopieren
Wer hat also schon einmal sys importiert und die Funktion setdefaultencoding aufgerufen? Die Antwort befindet sich im Lib-Ordner des Python-Installationsverzeichnisses. Es gibt eine Datei namens site.py [python2.6], in der Sie main() -->sys.setdefaultencoding( finden. kodierung), da diese site.py jedes Mal automatisch geladen wird, wenn der Python-Interpreter gestartet wird, sodass die Hauptfunktion jedes Mal ausgeführt wird und die Funktion setdefaultencoding gelöscht wird, sobald sie herauskommt.

__import__

Funktion:

Die gleiche Funktion wie die Importanweisung, aber __import__ ist eine Funktion und empfängt nur einen String als Parameter, sodass man sich seine Funktion vorstellen kann. Tatsächlich ruft die Importanweisung diese Funktion auf, um die Importarbeit auszuführen. import sys <==>sys = __import__('sys')

Verwendung:


__import__(module_name[, globals[, locals[, fromlist]]]) #可选参数默认为globals(),locals(),[]
__import__(&#39;os&#39;)  
__import__(&#39;os&#39;,globals(),locals(),[&#39;path&#39;,&#39;pip&#39;]) #等价于from os import path, pip
Nach dem Login kopieren
Hinweis:

Normalerweise kann diese Funktion beim dynamischen Laden verwendet werden, wenn Sie beispielsweise die in einem bestimmten Ordner verwendeten Module laden möchten, sich die Modulnamen darunter jedoch häufig ändern Mit dieser Funktion können Sie alle Module dynamisch laden. Das häufigste Szenario ist die Unterstützung von Plug-In-Funktionen.

Erweiterung:

Können Module dynamisch über Strings neu geladen werden, da Module dynamisch über Strings importiert werden können? Versuchen Sie reload('os'), um einen Fehler direkt zu melden. Obwohl Sie nicht direkt neu laden können, können Sie ein Modul zuerst deimportieren und dann __import__, um das Modul neu zu laden. Sehen wir uns nun an, wie der unimport-Vorgang implementiert wird. In der Python-Interpretation können Sie die in der aktuellen Umgebung geladenen Module und ihre Speicherorte über globals(), locals(), vars(), dir() und andere Funktionen anzeigen kann nur angezeigt werden, daher kann der Import nicht aufgehoben werden. Es gibt jedoch einen anderen Ort, an dem Module gespeichert werden können: sys.modules. Über sys.modules können Sie alle geladenen und erfolgreichen Module anzeigen, und es gibt mehr als nur globale Module , was darauf hinweist, dass standardmäßig einige zusätzliche Module geladen werden und der nächste Schritt der Deimport ist.


#!/usr/bin/env python  
#encoding: utf-8 
import sys 
__import__(&#39;a&#39;)   #第一次导入会打印消息 
del sys.modules[&#39;a&#39;]  #unimport 
__import__(&#39;a&#39;)  #再次导入还是会打印消息,因为已经unimport一次了 
__import__(&#39;a&#39;)  #这次就不会打印消息了
Nach dem Login kopieren

Zusammenfassung

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Unterschiede zwischen import, reload und __import__ in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage