day21 01包的初識 包:把解決一類問題的模塊放在同一個文件夾裡面 包(一個包裡面通常會含有_init_.py文件(python2裡面必須有),但是後面的就沒有要求一定要有了) 同樣導入的時候有import和 from import 兩種 註意:凡是導入是帶點的,點的左邊必須是一個包模塊,對於f ...
day21 01包的初識
包:把解決一類問題的模塊放在同一個文件夾裡面-----包(一個包裡面通常會含有_init_.py文件(python2裡面必須有),但是後面的就沒有要求一定要有了)
同樣導入的時候有import和 from import 兩種
註意:凡是導入是帶點的,點的左邊必須是一個包模塊,對於from import類型的來說,import後面不能帶有點,(from glance import policy.api是錯誤會報錯)
在pcharm的project裡面建立了一個glance包,而glance包裡面又有api,cmd,db包還有一個_init_.py文件,再在api包裡面又有一個policy.py和_versions_.py文件,
cmd裡面有一個_init_.py和manage.py文件,而db包裡面有一個models.py文件,要想生成這些文件,可執行以下代碼:
import os os.makedirs('glance/api') os.makedirs('glance/cmd') os.makedirs('glance/db') #創建三個目錄 l=[] #創建一個列表,是為了下麵將七個文件統一關閉 l.append(open('glance/_init_.py','w')) l.append(open('glance/api/_init_.py','w')) l.append(open('glance/api/policy.py','w')) l.append(open('glance/api/versions.py','w')) l.append(open('glance/cmd/_init_.py','w')) l.append(open('glance/cmd/manage.py','w')) l.append(open('glance/db/models.py','w')) #打開七個文件,同時生成文件句柄,把這七個文件句柄放到列表中 map(lambda f:f.close(),l) #拿到列表裡面每一個文件句柄,併進行關閉
各個生成的文件裡面的內容:
policy.py
def get(): print('from policy.py')
versions.py
def create_resource(conf): print('from versions.py: ',conf)
manage.py
def main(): print('from manage.py')
models.py
def register_models(endine): print('from models.py: ',engine)
生成一個glance包後,我們就可以執行導入的操作了:
(1)直接import+包點包點.....點方法,然後 print(包點包點.....點方法點get())就可以看到是否導入了
import glance.api.policy as policy policy.get()
運行結果:
from policy.py
(2)from 包點包點......點包 import 方法(這種方法需要註意import後面不能帶點)
from glance.api import policy policy.get()
運行結果:
from policy.py
如果此時在project下麵還有glance外面再建一個dir文件夾,此時要import glance就找不到了,因為:
導入的時候是根據以下路徑導入的,當將glance放到dir下麵的時候,只找到了前面兩個而且都是'C:\\Users\\sku1-1\\PycharmProjects\\untitled',後面就與它無關了,
而glance在dir裡面,dir在它的裡面,後面沒有說明就找不到了。
import sys print(sys.path)
運行結果:
['C:\\Users\\sku1-1\\PycharmProjects\\untitled', 'C:\\Users\\sku1-1\\PycharmProjects\\untitled', 'C:\\Users\\sku1-1\\PycharmProjects\\untitled\\venv\\Scripts\\python35.zip', 'C:\\Users\\sku1-1\\AppData\\Local\\Programs\\Python\\Python35\\DLLs', 'C:\\Users\\sku1-1\\AppData\\Local\\Programs\\Python\\Python35\\lib', 'C:\\Users\\sku1-1\\AppData\\Local\\Programs\\Python\\Python35', 'C:\\Users\\sku1-1\\PycharmProjects\\untitled\\venv', 'C:\\Users\\sku1-1\\PycharmProjects\\untitled\\venv\\lib\\site-packages', 'C:\\Users\\sku1-1\\PycharmProjects\\untitled\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.5.egg', 'C:\\Users\\sku1-1\\PycharmProjects\\untitled\\venv\\lib\\site-packages\\pip-10.0.1-py3.5.egg', 'C:\\Program Files\\JetBrains\\PyCharm 2018.2.2\\helpers\\pycharm_matplotlib_backend']
要想找到glance,只能通過:
from dir.glance.api import policy policy.get()
或者先添加一個路徑給它:
sys.path.insert(0,'C:\\Users\\sku1-1\\PycharmProjects\\untitled\\dir')#在第一個路徑插入,這裡多了一個dir from glance.api import policy policy.get()
運行結果:
from policy.py
如果按照以下代碼執行導入:
import glance glance.api.policy.get()#找不著
是會報錯的,運行結果:
Traceback (most recent call last): File "<encoding error>", line 23, in <module> AttributeError: module 'glance' has no attribute 'api'
為什麼呢?
平時我們導入一個模塊,就會執行這個模塊,但是導入一個包,它不會執行裡面的方法,而是預設執行它裡面的_init_.py文件,可以在_init_.py文件裡面放一些內容,
並執行 import glance就可以驗證了
由於每次導入一個包都會執行它的init文件,所以可以在_init_.py裡面進行操作,所以先在dir下的_init_.py文件裡面導入:
from glance import api from glance import cmd from glance import db
而此時也還是導入了一個 api,cmd,db包,還是不會執行api裡面的policy方法,同樣跟上面一樣,繼續在glance包裡面的_init_.py文件導入policy:
from glance.api import policy
此時我們就可以執行以下代碼,而不會報錯了
import glance glance.api.policy.get()
運行結果:
from policy.py