Soweit nicht anders angegeben, basiert das Folgende auf Python3
Zusammenfassung
Um den Code wiederzuverwenden und besser zu warten, verwendet Python
Module und Pakete; eine Python
-Datei ist ein Modul und ein Paket ist ein spezielles Verzeichnis organisiert Module (einschließlich __init__.py
Datei).
Modulsuchpfad, Python
Der Interpreter sucht nach Modulen in einem bestimmten Verzeichnis, und bei der Ausführung ist sys.path
der Suchpfad.
Verwenden Sie das Schlüsselwort import
, um das Modul zu importieren. Achten Sie auf die Beziehung zwischen import *
und __all__
.
Ein Modul ist eine Datei, die Python-Definitionen und -Anweisungen enthält
Python
Ein Modul ist eine Datei mit Definitionen und Anweisungen. Der Dateiname ist der Name des Moduls plus das Suffix .py
.
Angenommen, es gibt eine Funktion oder Klasse, die eine bestimmte Funktion ausführt und einfach zu verwenden ist. Um diese Funktion nutzen zu können, müssen Sie diesen Code in jede Datei kopieren, die Sie verwenden müssen. Doppelter Code ist in der Programmierung ein Tabu. Wenn die Funktionsimplementierung geändert werden muss, muss jede Stelle geändert werden, an der sie auftritt.
Die Wiederverwendung kann dieses Problem sehr gut lösen. Tatsächlich erleichtern Strukturen wie Funktionen und Klassen in gewissem Maße auch die Wiederverwendung.
Python
organisiert eine Reihe verwandter Funktionen, Klassen usw. in einer Datei, und jede Datei ist ein Python
-Modul.
Verwenden Sie das Schlüsselwort import
, um das Modul zu importieren (das Modul muss sich im Suchpfad befinden):
import sys; grundlegende Importanweisung.
System als System importieren; Alias für den importierten Namen.
aus dem Systemimportpfad; Modulspezifische Elemente importieren.
from sys import *; alle importierbaren Namen aus sys importieren
import-only-once
Modul Das Verhalten Der einmalige Import ist in den meisten Fällen eine erhebliche Optimierung. Wenn Sie im selben Interpreter-Lebenszyklus die import
-Anweisung mehrmals verwenden, um dasselbe Modul zu importieren, erfolgt der Import nur einmal.
Dies kann durch Hinzufügen von Ausgabeanweisungen zum Modul nachgewiesen werden. Die Verwendung von
import *
und __all__
mit import *
kann den Namensraum des aktuellen Moduls verunreinigen und einige Namen importieren, die nicht in Anführungszeichen gesetzt werden müssen. Daher wird seine Verwendung nicht empfohlen.
Tatsächlich stellt ein standardisiertes Modul eines Drittanbieters eine öffentliche Modulschnittstelle bereit, die die für das Modul verfügbaren Schnittstellen offenlegt. Öffentliche Schnittstellen werden durch eine Liste von Modulnamen __all__
definiert.
Wenn Sie beispielsweise ein Modul mit dem Namen mtest1
definieren:
__all__ = ['test1', 'test12']def test1():print('test1')def test11():print('test11')def test12():print('test12')
Verwenden Sie alle Importmethoden:
>>> form mtest1 import *>>> dir()>>> ['__annotations__', '__builtins__', '__doc__', '__loader__','__name__', '__package__', '__spec__', 'test1', 'test12']
Sie können sehen, dass die Funktion test11()
nicht importiert wurde. Dies ist die Rolle von __all__
.
Um Module besser zu organisieren, werden Module in Pakete gruppiert.
Aus Sicht des Dateisystems ist das Paket das Verzeichnis, in dem sich das Modul befindet. Damit der Python
-Interpreter es als Paket behandeln kann, muss das Paket direkt eine Datei (Modul) mit dem Namen __init__.py
enthalten.
Ein Paket ist im Grunde ein anderer Modultyp, außer dass es andere Module und Pakete enthalten kann. Als Modul ist der Inhalt eines Pakets tatsächlich der Inhalt der Datei __init__.py
(Modul).
Zum Beispiel lautet die Datei constants
für ein Paket mit dem Namen constants/__init__.py
wie folgt:
PI = 3.14
Dann kann das Paket constants
behandelt werden als gewöhnliches Modul:
import constantsprint(constants.PI)
Wenn Sie ein Paket mit dem Namen drawing
erstellen möchten, das shapes
und <🎜 enthält > Module müssen Sie das Verzeichnis und die Datei erstellen: colors
假设已经将~/python
作为搜索目录。依照这个设置,下列导入语句都是合法的:
import drawing
# 导入drawing包(即__init__.py
模块)
import drawing.colors
# 导入colors模块,使用drawing.colors.attr的方式引用
from drawing import shapes
# 导入shapes模块
__all__
变量
与模块的__all__
变量相似,包的__all__
变量决定了使用from package import *
导入的子模块。
如以上drawing
包的__init__.py
文件内容如下:
__all__ = ['colors']
那么使用from drawing import *
只会导入colors
模块。
现在已经编写完了一个很好用的模块,并且通过了测试。那么如何让这个模块可用呢?即如何让这个模块具备可导入到其他模块的能力。
当使用import
语句导入模块时,Python
解释器通过以下方式搜索模块:
首先搜索built-in
模块
最后搜索变量sys.path
提供的路径列表
sys.path
在解释器启动时从以下位置初始化:
当前脚本路径
环境变量PYTHONPATH
指定的路径集合
安装默认路径
sys.path
初始化完成后,可以在运行时修改。
那么现在若要使模块可用,一是将其放置到已有的搜索路径下,二是指定模块所在路径为搜索路径。
一般情况下,若选择第一种方式,我们将模块放置到Python
安装路径的\lib\site-packages
下,这个目录是专门用来安装第三方模块的。正如该目录下的README
文件展示的那样:
This directory exists so that 3rd party packages can be installed here. Read the source for site.py for more details.
若选择第二种方式,直接将模块所在目录加入到环境变量PYTHONPATH
中即可。
值得注意的是,可以在\lib\site-packages
路径下新建一个名为user_lib.pth
的文件,内容是需要搜索的路径,一行一个,也可以将指定路径加入到搜索目录中:
Das obige ist der detaillierte Inhalt vonPython-Grundlagen – detaillierte Erklärung von Paketen und Modulen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!