1. 程式人生 > >模塊 ,包

模塊 ,包

sys 開頭 文件 找不到 不變 逗號 全部 滿足 生效

# 模塊
# 模塊的分類
# 內置模塊 :
# 安裝python解釋器的時候跟著裝的那些方法
# 第三方模塊/擴展模塊 :
# 沒在安裝python解釋器的時候安裝的那些功能
# 自定義模塊:
# 自己寫的功能如果是一個通用的的功能,那就能把它當作一個模塊

# 什麽是模塊
# 有的功能開發者自己無法完成,這樣的話需要借助已經實現的函數\類來完成這些功能,如果實現不了
# 的功能都由別人替你實現了
# 操作系統打交道
# 和時間
# 1000取隨機數
# 壓縮一個文件

# 和網絡通信
# 別人寫的一組功能 文件夾/py文件/c語言編譯好的一些編譯文件
#
# 為什麽要有模塊?
# 分類 管理方法
# 節省內存
# 提供更多的功能

# 模塊怎麽用?在哪兒用?
#import my_module # 要導入一個py文件的名字,但是不加.py後綴名
#import my_module #模塊的名字必須要滿足變量的命名規範
#一般 情況下 模塊都是小寫字母開頭的名字

#import 這個語句相等於什麽?
# import 這個模塊相等於執行了這個模塊所在的py文件

#一個模塊不會被重復導入

#如何使用模塊

# import my_module
# def login():
# print(‘in mine login‘)
# name=‘heiehie‘
# login()
# my_module.login()
# print(my_module.login())

# 模塊的重命名 用 as
# import os,my_module #註 可以用逗號隔開導入多個模塊,但命名規範用多行導入模塊
# 比如
# import os
# import my_module
# PEP8規範
# 所有的模塊導入都應該盡量放在這個文件的開頭
# 模塊的導入也有順序的: 先導入內置模塊,再導入第三方模塊,最後導入自定義模塊



# ******************************************************************
# 為什麽要有模塊
# 模塊分為哪幾種
# import
# import 的時候發生了什麽
# 在import的時候命名空間的變換
# 重命名
# 一行導入多個模塊
# from ... import ...
# from import 的時候發生了什麽
# 在import的時候命名空間的變換
# 重命名 as
# 一行導入多個名字
# from 模塊 import *
# * 和 __all__ 的相關性
# 模塊相關的其他知識
# 1.把模塊當成腳本運行 : 從本模塊中反射本模塊中的變量
# if __name__ == ‘__main__‘:
# 所有不需要調用就能執行的內容
# import sys
# getattr(sys.modules[__name__],‘要反射的變量名‘)
# 2.模塊搜索路徑 sys.path
# 3.pyc編譯文件
# 4.重新加載模塊 已經導入的模塊即便被修改在程序執行過程中也不會生效
# 5.模塊的循環引用 - 不允許
# 包 ***
# 什麽是包? 集合了一組py文件 提供了一組復雜功能的
# 為什麽要有包? 當提供的功能比較復雜,一個py文件寫不下的時候
# 包中都有什麽? 至少擁有一個__init__.py
# 直接導入模塊
# import 包.包.模塊
# 包.包.模塊.變量
# from 包.包 import 模塊 # 推薦 平時寫作業的過程
# 模塊.變量
# 導入包 讀框架源碼的時候
# 如要希望導入包之後 模塊能夠正常的使用 那麽需要自己去完成init文件的開發
# 包中模塊的 絕對導入
# 包中模塊的 相對導入
# 使用了相對導入的模塊只能被當做模塊執行
# 不能被當做腳本執行
# ******************************************************************
# import qwe
# qwe.login()

# from qwe import *
# login()
# 不是python解釋器發現的錯誤,而是pycharm根據它的一些判斷而得出的結論

# from import 的時候發生了什麽 仍然相當於執行了整個py文件
# 在from import的時候命名空間的變換
# 導入了什麽 就能使用什麽 不導入的變量 不能使用
# 不導入並不意味著不存 而是沒有建立文件到模塊中其他名字的引用
# def login(): print(‘in my login‘)
# 當模塊中導入的方法或者變量 和 本文件重名的時候,那麽這個名字只代表最後一次對它賦值的哪個方法或者變量
# login()
# from my_module import login
# login()
# from my_module import name
# print(name)
# 在本文件中對全局變量的修改是完全不會影響到模塊中的變量引用的

# 重命名
# from my_module import login as l
# l()

# 導入多個
# from my_module import login,name
# login()
# print(name)
# name = ‘太亮‘
# login()

# 導入多個之後再重命名
# from my_module import login as l,name as n

# from 模塊 import *
# from my_module import *
# login()
# name

# __all__可以控制*導入的內容
# from my_module import *
# login()
# from my_module import name
# print(name)

# 運行一個py文件的兩種方式
# 1.以模塊的形式運行
# import my_module
# if __name__ == ‘__main__‘:
# my_module.login()
# 2.直接pycharm運行 cmd運行
# ----以腳本的形式運行
# 那麽需要在本文件中直接打印的代碼上加上
# if __name__ == ‘__main__‘:

# import sys
# import my_module
# sys.modules
# {‘sys‘:文件的內存地址,
# ‘my_module‘: my_module的地址
# ‘__main__‘:當前直接執行文件所在的地址}
# 存儲了所有導入的文件的名字和這個文件的內存地址

# 再使用反射自己模塊中的內容的時候
# import sys
# getattr(sys.modules[__name__],變量名)

# import sys
# print(sys.path)
# sys.path.append(‘D:\sylar\python_workspace‘)
# import aaa
# 模塊沒導入之前在硬盤上
# 安裝python
# python整個包的結構不變
# 它會記錄一個安裝目錄
# 其他所有目錄都是根據安裝目錄來寫死的
# ‘D:\\sylar\\python_workspace\\day22‘, 是你當前運行的腳本所在的目錄
# ‘D:\\sylar\\python_workspace\\day22‘ 是pycharm在你打開項目的時候給你添加進來的項目根目錄
# 剩余所有都是python內置的目錄
# 內置模塊的導入
# 第三方模塊的導入
# 內置模塊的導入和第三方模塊的導入都不需要你操心了
# 自定義的模塊能否被導入
# 看sys.path當中 是否存在你要導入的文件 所在的目錄
# 總結
# 模塊的搜索路徑全部存儲在sys.path列表中
# 導入模塊的順序,是從前到後找到一個符合條件的模塊就立即停止不再向後尋找
# 如果要導入的模塊和當前執行的文件同級
# 直接導入即可
# 如果要導入的模塊和當前執行的文件不同級
# 需要把要導入模塊的絕對路徑添加到sys.path列表中

# import aaa
# import time
# import importlib
# aaa.login()
# time.sleep(20)
# importlib.reload(aaa) # 表示重新加載 並且在修改腳本並要運行腳本才生效
# aaa.login()

# 在import之後 再修改這個被導入的模塊
# 程序感知不到

# reload這種方式可以強制程序再重新導入這個模塊一次
# 非常不推薦你使用

# 在模塊的導入中 不要產生循環引用問題
# 如果發生循環導入了
# 就會發現明明寫在這個模塊中的方法,確偏顯示找不到


# import glance.api.policy
# glance.api.policy.get()

# import glance.api.policy as policy
# policy.get()

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

# 導入包 相當於執行了這個包下面的__init__.py
# import glance
# # 設計一下init文件來完成一些模塊的導入
# glance.api.policy.get()
# glance.db.models

# from aaa import glance

# from aaa import glance2
# glance2.api.policy.get()

# ***********************************************************************************************
# import 模塊
# 導入這個模塊之後 模塊內的所有名字 就都可以通過模塊來引用了
# 模塊名.名字

# from 模塊 import 名字
# 導入這個模塊中的某個名字之後,這個名字就可以直接使用了
# 名字是變量 直接用
# 名字是函數 函數名()就是調用
# 名字是類名 類名()就是實例化

# 模塊的循環引用 - 不能

# 把模塊當成腳本運行 :
# 你希望 某一段代碼 在被當做模塊導入的時候 不要執行
# 就把它卸載 if __name__ == ‘__main__‘:下面

# sys.path 一個自定義模塊能否被導入,就看sys.path列表中有沒有這個模塊所在的絕對路徑
# import 模塊名 # ModuleNotFoundError : No module named ‘模塊名‘

# 包
# 從包中導入模塊,要註意這個包所在的目錄是否在sys.path
# from aaa.bbb.ccc import get # 正確的
# from bbb.ccc import get # ModuleNotFoundError: No module named ‘bbb‘
# get.func()

# 如果是直接導入一個包,那麽相當於執行了這個包中的__init__文件
# 並不會幫你把這個包下面的其他包以及py文件自動的導入到內存
# 如果你希望直接導入包之後,所有的這個包下面的其他包以及py文件都能直接通過包來引用
# 那麽你要自己處理__init__文件

模塊 ,包