1. 程式人生 > >模塊與包 Mysql與Oracle區別

模塊與包 Mysql與Oracle區別

報錯 lib func 獨立 內置函數 區別 共享庫 rac 第一次

1 什麽是模塊?

常見的場景:一個模塊就是一個包含了python定義和聲明的文件,文件名就是模塊名字加上.py的後綴。

但其實import加載的模塊分為四個通用類別: 

  1 使用python編寫的代碼(.py文件)

  2 已被編譯為共享庫或DLL的C或C++擴展

  3 包好一組模塊的包

  4 使用C編寫並鏈接到python解釋器的內置模塊

2),模塊的執行:import,每個模塊都是一個獨立的名稱空間。

模塊可以包含可執行的語句和函數的定義,這些語句的目的是初始化模塊,它們只在模塊名第一次遇到導入import語句時才執行(import語句是可以在程序中的任意位置使用的,且針對同一個模塊很import多次,為了防止你重復導入,python的優化手段是:第一次導入後就將模塊名加載到內存了,後續的import語句僅是對已經加載大內存中的模塊對象增加了一次引用,不會重新執行模塊內的語句)。

3)1,from:而from 語句相當於import,也會創建新的名稱空間,但是將my_moudle中的名字直接導入到當前的名稱空間中,在當前名稱空間中,直接使用名字就可以了。

 1 from my_moudle import read1,read2


註意:
當你調用模塊時,在你當前使用的頁面中不能出現和模塊,相同的對象,名稱。
不然會存在一個覆蓋的情況,而且當你覆蓋以後,後面你調用的模塊會永久失去效用,所以盡量不要取和模塊相同的名稱



PS:當你運行一個模塊的時候,模塊會先加載到內存,那個時候你是不能更改的,
2.from spam import * 把spam中所有的不是以下劃線(_)開頭的名字都導入到當前位置,
大部分情況下我們的python程序不應該使用這種導入方式,因為*你不知道你導入什麽名字,
很有可能會覆蓋掉你之前已經定義的名字。而且可讀性極其的差,在交互式環境中導入時沒有問題。
PS:
from spam import *:是把所有的spam裏的內容都加載到內存中,並且隨時可以調用,而加載的位置是當前你輸入這段代碼的位置。

4)

考慮到性能的原因,每個模塊只被導入一次,放入字典sys.module中,如果你改變了模塊的內容,你必須重啟程序,python不支持重新加載或卸載之前導入的模塊,

有的同學可能會想到直接從sys.module中刪除一個模塊不就可以卸載了嗎,註意了,你刪了sys.module中的模塊對象仍然可能被其他程序的組件所引用,因而不會被清除。

特別的對於我們引用了這個模塊中的一個類,用這個類產生了很多對象,因而這些對象都有關於這個模塊的引用



import
time,importlib import aa time.sleep(20) # importlib.reload(aa) aa.func1() 在20秒的等待時間裏,修改aa.py中func1的內容,等待test.py的結果。 打開importlib註釋,重新測試


結果:是不會改變,因為當你運行的時候,系統已經把代碼加載到內存,在內存中是不會被修改的。

如果用reload的話,在reload()裏面加的是被調用的模塊名,另外在修改以後要ctrl + s保存一下,然後才能改。

5):__name__

我們可以通過模塊的全局變量__name__來查看模塊名:
當做腳本運行:
__name__ 等於‘__main__‘

當做模塊導入:
__name__= 模塊名

作用:用來控制.py文件在不同的應用場景下執行不同的邏輯
if __name__ == ‘__main__‘:

__name____name__在被調用的模塊中,顯示的是被調用模塊的名字(比如:我被調用的模塊名字是verw,那我調用的print(__name__)顯示的是verw),而在調用的程序中顯示的是__main__。

6):在定義一個變量名的時候,變量名盡量不要和內置函數,還有模塊名重復,不然會產生錯誤。

7):包:含義以及註意事項。 (

相對路徑在同一個包內部能用,專門提供給別人用。 絕對路徑,是全部地方都能用,但是當裏面的一個路徑一遍就會全部改變, 所以相對來說,以後多用相對路徑。 import *的,要用‘__all__’=‘ ’接收

1. 無論是import形式還是from...import形式,凡是在導入語句中(而不是在使用時)遇到帶點的,都要第一時間提高警覺:這是關於包才有的導入語法

2. 包是目錄級的(文件夾級),文件夾是用來組成py文件(包的本質就是一個包含__init__.py文件的目錄)

3. import導入文件時,產生名稱空間中的名字來源於文件,import 包,產生的名稱空間的名字同樣來源於文件,即包下的__init__.py,導入包本質就是在導入該文件

強調:

  1. 在python3中,即使包下沒有__init__.py文件,import 包仍然不會報錯,而在python2中,包下一定要有該文件,否則import 包報錯

  2. 創建包的目的不是為了運行,而是被導入使用,記住,包只是模塊的一種形式而已,包即模塊

註意事項:

1.關於包相關的導入語句也分為import和from ... import ...兩種,但是無論哪種,無論在什麽位置,在導入時都必須遵循一個原則:
凡是在導入時帶點的,點的左邊都必須是一個包,否則非法。可以帶有一連串的點,如item.subitem.subsubitem,但都必須遵循這個原則。
2.對於導入後,在使用時就沒有這種限制了,點的左邊可以是包,模塊,函數,類(它們都可以用點的方式調用自己的屬性)。 3.對比import item 和from item import name的應用場景: 如果我們想直接使用name那必須使用後者。

2:包的調用-----絕對導入和相對導入

我們的最頂級包glance是寫給別人用的,然後在glance包內部也會有彼此之間互相導入的需求,這時候就有絕對導入和相對導入兩種方式:

絕對導入:以glance作為起始

相對導入:用.或者..的方式最為起始(只能在一個包中使用,不能用於不同目錄內)

例如:我們在glance/api/version.py中想要導入glance/cmd/manage.py

在glance/api/version.py

#絕對導入
from glance.cmd import manage
manage.main()

#相對導入
from ..cmd import manage
manage.main()


註意:特別需要註意的是:可以用import導入內置或者第三方模塊(已經在sys.path中),但是要絕對避免使用import來導入自定義包的子模塊(沒有在sys.path中),應該使用from... import ...的絕對或者相對導入,且包的相對導入只能用from的形式。

PS:
    也就是說,一個包內的兩個不同文件,不要用import直接導入,因為a文件import另b文件的時候,其c文件就調用不了a。

(1)絕對導入:

也就是from導入,從一個包調用另一個包。

(2)相對導入:

也就是用.。和。。導入,。一個點的時候表示同級的目錄,。。兩個點的時候表示上一層目錄。

PS:用.和..表示的時候,同一個包內是不能調用的,即使調用了也沒有用。

8):Mysql與Oracle區別

1. Oracle是大型數據庫而Mysql是中小型數據庫,Oracle市場占有率達40%,Mysql只有20%左右,同時Mysql是開源的而Oracle價格非常高。
2. Oracle支持大並發,大訪問量,是OLTP最好的工具。
3. 安裝所用的空間差別也是很大的,Mysql安裝完後才152M而Oracle有3G左右,且使用的時候Oracle占用特別大的內存空間和其他機器性能。
4.Oracle也Mysql操作上的一些區別

模塊與包 Mysql與Oracle區別