模塊和包

1、import 模塊python

import一個模塊至關於執行了這個模塊,導入模塊後可使用模塊中的屬性和方法,好比模塊名.變量、模塊名.函數api

當前模塊和被導入模塊是存在兩個不一樣的內存空間ide

 

import模塊的原理:函數

① 尋找模塊spa

② 找到模塊就開闢一塊空間,來執行這個模塊code

③ 把這個模塊中用到的名字都收錄到新開闢的空間中blog

④ 建立一個變量來引用這個模塊的空間內存

 

導入模塊注意點:pycharm

① 一個模塊不能被重複導入
② 模塊和模塊之間的內存空間始終是隔離的cmd

③ 模塊的名字必須符合變量的命名規則,不然沒法導入

④ 被導入模塊的方法只會找到它本身的模塊空間的屬性

⑤ 一行只能導入一個模塊(符合PEP8規範)

 

能夠給導入的模塊起別名,但起了別名之後,原來的模塊名就不能使用了。

起別名的原理:找到這個模塊,用別名指向它,因此原模塊名跟模塊不要緊了

import XXX as X

# mymodule.py
a = 1

def func(): print(222) # main.py
import mymodule as m print(m.a) m.func()

 

模塊的搜索路徑:

執行一個文件,依靠的是sys.path

pycharm會將項目的目錄放進去,可是運行程序有時並不在pycham,

目前python會及那個當前文件的目錄導進來,而後再導入項目

正常的sys.path中除了內置、擴展模塊所在的路徑以外

只有一個路徑是永遠不會出現問題,直接執行的這個文件所在的目錄

一個模塊可否被導入,就看這個模塊所在的目錄在不在sys.path中

 

兩種運行py文件的方式:

① 直接運行:cmd下 python xxx.py 

 以腳本的形式去運行,__name__ == '__main__'

② 導入模塊

__name__ == '模塊名'

 

if __name__ == '__main__'

當一個文件做爲一個腳本又做爲一個模塊,做爲模塊的時候將打印的東西放在 if __name__ == '__main__' 邏輯裏

全部的打印邏輯和函數的調用,都放在  if __name__ == '__main__'  的邏輯內,一旦導入模塊的時候,if的內容不會執行

 

2、from... import ...

① from 模塊 import 變量/方法

找到模塊,開闢空間執行模塊

全部的模塊裏的屬性和方法都存儲的模塊的所屬的空間中

在全局命名空間建立一個變量名/方法名分別指向模塊中的名字

# mymodule.py
 a = 1

def func(): print(222) # main.py

from mymodule import a print(a)

 

② from 模塊 import *

至關於把模塊的全部方法、變量導入到當前的全局命名空間中。

通常狀況下,使用的變量超過5個就使用星號

 

在模塊中添加了 __all__, 把模塊裏能用的變量或者方法放在__all__中,但all只能跟*配合使用

# mymodule.py

__all__ = ['a','b']         # 若是導入的是星號,只能使用a、b兩個變量,不能使用方法
a = 1 b = 2

def func(): print(222) def func2(): print(333) # main.py

from mymodule import *      # 只能使用模塊裏__all__定義的內容
func() print(a) # 報錯,NameError: name 'func' is not defined

 

3、模塊的補充:

① pyc文件、pyi文件

pyi文件是跟py同樣文件,只是後綴名不同,裏面也是python的代碼

pyc是編譯好的字節碼文件,但一個模塊看成模塊執行的時候,會產生一個pyc文件,下次導入模塊的時候,會直接使用pyc文件,假如在下次調用前模塊修改過,那麼纔會再產生一個pyc文件

pyc文件提升程序的啓動效率並不能提升程序的執行效率,pyc文件再啓動的時候會產生,若是要提升啓動效率,提早先執行python程序

 

② 模塊的導入和修改

導入模塊後,在執行程序中修改模塊的內容,源程序不會使用修改後的值,就算從新導入模塊也不會使用修改後的值

 

解決方法(不建議使用):

from importlib import reload

reload(模塊名)

 

③ 模塊的循環引用

A import B

B import A

循環引用會報錯,在程序中不要發生循環引用的問題,只能是單向引用,不能成環。

 

④ dir(模塊名)

dir(模塊名) 獲取模塊的是全部方法和屬性,用反射的方式來調用

 

4、包

python3中的Directory和package都帶__init__.py的文件

含有一個__init__.py的文件夾就是一個包

python2中沒有__init__.py文件就不能導入模塊了,可是能夠手動建立__init__.py,這樣就變成了一個包

 

從包中導入模塊:

imprt XXX.XXX.XXX

點的左邊必須是一個包,終點必須是一個模塊,精確到具體的模塊

 

from ... import ...

通常狀況:from 包 import 模塊

 

導入包:

導入包的過程至關於執行了這個包的__init__.py文件

做爲一個包,全部包內的文件的導入都要考慮sys.path的問題(相對導入了這個問題)

sys.path中的內容 永遠是當前執行的文件

 

絕對路徑導入優勢:能看清楚目錄的層次關係

絕對路徑導入缺點:每次移動都要修改絕對導入路徑

glance/ ├── __init__.py      from glance import api from glance import cmd from glance import db ├── api │ ├── __init__.py  from glance.api import policy from glance.api import versions │ ├── policy.py │ └── versions.py ├── cmd from glance.cmd import manage │ ├── __init__.py │ └── manage.py └── db from glance.db import models ├── __init__.py └── models.py
絕對導入

 

相對路徑導入

. 表示當前目錄

.. 表示上一層目錄

glance/ ├── __init__.py      from . import api  #.表示當前目錄
                     from . import cmd from . import db ├── api │ ├── __init__.py  from . import policy from . import versions │ ├── policy.py │ └── versions.py ├── cmd from . import manage │ ├── __init__.py │ └── manage.py from ..api import policy #..表示上一級目錄,想再manage中使用policy中的方法就須要回到上一級glance目錄往下找api包,從api導入policy
 └── db from . import models ├── __init__.py └── models.py 相對導入
相對導入

 

若是帶着相對路徑導入的文件,就不能被執行,只能是看成模塊導入。

相對路徑導入通常是給包外的文件提供服務,包內的文件不能執行,運用了相對路徑導入的文件不能被執行。

 

5、項目目錄規劃

項目名稱的文件夾

  bin 文件夾               (只能由start.py 文件,只有一個文件,並且名字不能改變)

    start.py     # 負責項目的啓動

 

  conf  文件夾        (配置文件的目錄,文件都要統一格式)

    config.ini

    settings.py(推薦使用)

  

  core 文件夾              (存放的是核心代碼)

  db    文件夾               (存放的是數據文件,不是py文件)

  lib    文件夾    (存放庫文件,放第三方模塊或者自定義模塊)

  log  文件夾     (存放的是log文件)   

    log

相關文章
相關標籤/搜索