Python之模組與包

2021-09-12 08:05:49 字數 3671 閱讀 2370

'''模組匯入過程:0.先判斷sys.modules字典中檢視模組是否已經存在,如存在則不做任何操作

1.從sys.path路徑下找到模組

2.建立模組的命名空間

3.把檔案中的名字都放到這個命名空間裡

'''# import sys

# print(sys.path)

# import modue1 # import只匯入一次,匯入時會執行一邊模組中的**,會輸出'this is func1'

# print(sys.modules['modue1']) #

# import modue1 # 沒有任何輸出

# import modue1 # 沒有任何輸出

# 模組匯入可以改變模組名

# import modue1 as md1

# md1.func1()

'''編碼規則:匯入順序

import 內建模組

import 擴充套件模組

import 自定義模組

'''# 可以從模組中的匯入方法 -- 注意:當前如果有乙個func1函式,且定義在匯入後則使用當前的

# def func1():

#     print('current func1')

# from modue1 import func1

# func1() # this is func1

# from modue1 import func1

# def func1():

#     print('current func1')

# func1() # current func1

'''修改modue1**為:

# variable = 100

def func1():

print('this is func1',variable)

if __name__ == '__main__':

func1()

'''# from modue1 import func1

# # func1()

# variable = 200

# func1() # nameerror: name 'variable' is not defined

# 匯入的方法始終呼叫模組中的邊量

# __all__列表的作用

'''修改modue1:

__all__ = ['variable']

variable = 100

def func1():

print('this is func1',variable)

if __name__ == '__main__':

func1()

'''# from modue1 import *

# print(variable) # 輸出100

# func1() # nameerror: name 'func1' is not defined

# from modue1 import variable,func1

# print(variable) # 100

# func1() # this is func1 100

# __all__在使用import * 時限制匯入在__all__列表中的名字

# 在包外使用包

# 使用import

# import glance.api.policy

# glance.api.policy.get()

# import glance.api.versions

# glance.api.versions.create_resource('test.conf')

# import glance.api.policy.get 丟擲異常

# 使用from ... import ...

# from glance.api import policy

# policy.get()

# from glance.api.policy import get

# get()

# from glance import api.policy 丟擲異常

# 注意: '.'的左邊必須是包,from ... import ...匯入時,import後面不能再帶'.'

#versions.py

def create_resource(conf):

print('from version.py: ',conf)

# 絕對匯入 -- pycharm 會把當前所在目錄以及專案的絕對路徑新增倒sys.path中

# import sys

# print(sys.path[0],'\n',sys.path[1])

# from glance.cmd import manage

# manage.main()

# 如何讓包可以關聯匯入

# import glance

# glance.api.policy.get() # attributeerror: module 'glance' has no attribute 'api'

# 利用__init__.py

'''glance/__init__.py

from glance import api

'''# import glance

# glance.api.policy.get() # attributeerror: module 'glance.api' has no attribute 'policy'

'''glance/__init__.py

from glance import api

glance/api/__init__.py

from glance.api import policy

'''# import glance

# glance.api.policy.get() # from policy.py

'''匯入glance時,執行glance下的__init__.py:from glance import api

所以api也被匯入了,api包匯入時,glance/api/__init__.py又被執行了

所以policy也被匯入了,此時只匯入glance則整個包鏈全部匯入了

'''# 但是絕對匯入整個報的結構不能改變,否則匯入不成功,例如把api放到glance/newdir下,再次匯入則失敗了

# 相對匯入

'''glance/__init__.py

from . import api

glance/api/__init__.py

from . import policy

'''# import glance

# glance.api.policy.get() # from policy.py

# 相對匯入可以任意改變包的目錄結構,例如把api放到glance/newdir下,再次匯入依然可以成功

# import glance

# glance.newdir.api.policy.get() # from policy.py

# 相對匯入如果在包的內部無法匯入其它模組

# 在policy.py中

# from .. import cmd

# cmd.manage.main() # valueerror: attempted relative import beyond top-level package

Python之模組與包

a 在 python 中,乙個.py檔案就稱之為乙個模組 module 大大提高了 的可維護性 編寫 不必從零開始。當乙個模組編寫完畢,就可以被其他地方引用 b 呼叫函式時用import a getpass模組提供了可移植的密碼輸入 import getpass getpass.getpass b ...

python之模組與包

包是一種通過使用模組名來組織python模組命名空間的方式 無論是import形式還是from.import形式,凡是在匯入語句中 而不是在使用時 遇到帶點的,都要第一時間提高警覺 這是關於包才有的匯入語法 包的本質就是乙個包含 init py檔案的目錄 凡是在匯入時帶點的,點的左邊都必須是乙個包 ...

Python之模組與包

通常 乙個模組就是乙個包含了python定義和宣告的檔案 檔名就是模組名字加上.py的字尾 模組可以被匯入使用。但import載入的模組分為四個通用類別 1.使用python編寫的.py檔案 2.已被編譯為共享庫或dll的c或c 擴充套件 3.把一系列模組組織到一起的資料夾 注 資料夾下有乙個 in...