1. 程式人生 > >Python學習筆記-模塊

Python學習筆記-模塊

python 模塊

模塊:

頂層文件(也是模塊文件)

模塊文件

模塊在物理形式上表現為.py結尾的代碼文件

Python中,模塊本身也是對象,所以模塊也有變量,函數,類

在一個模塊的頂層定義的所有變量都在被導入時成為了被導入模塊的屬性

查看標準庫模塊:

help(‘modules‘)

頂層文件:包含了程序的主要控制流程

模塊文件:為頂層文件或其他模塊提供各種功能組件


import module [,module1[,module2]]語句 導入模塊

導入指定的整個模塊,包括生成一個以模塊名命名的名稱空間

導入模塊別名(有別名以後不能再使用原名,防止重復的名字空間):

import module as module_alias


from-import語句(負面作用:會導致屬性覆蓋)

常用於只導入指定模塊的部分屬性至當前名稱空間

from module import name1[,name2[,name3]]


import和from-import是賦值語句

import和from是可執行語句,類似於def,因此他們嵌套再if測試中,出現def中等等


import和from都是隱形的賦值語句

如果本程序中有聲明變量a = 10 ,導入的模塊中也有變量a = 20,那麽模塊中的變量覆蓋原程序的變量,此時a = 20


import語句導入模塊三個步驟:

1.找到模塊文件:在指定的路徑下搜索模塊文件(依次查找,查到就停止)

搜索的路徑:程序的主目錄,PythonPath目錄(如果設置了此變量),標準鏈接庫目錄,任何.pth文件的內容(如果存在.pth文件)

In [9]: import sys
In [11]: print (sys.path)
[‘‘, ‘/usr/local/python361/bin‘, ‘/usr/local/python361/lib/python36.zip‘, ‘/usr/local/python361/lib/python3.6‘, ‘/usr/local/python361/lib/python3.6/lib-dynload‘, ‘/usr/local/python361/lib/python3.6/site-packages‘, ‘/usr/local/python361/lib/python3.6/site-packages/ipython-6.1.0-py3.6.egg‘, ‘/usr/local/python361/lib/python3.6/site-packages/pexpect-4.2.1-py3.6.egg‘, ‘/usr/local/python361/lib/python3.6/site-packages/Pygments-2.2.0-py3.6.egg‘, ‘/usr/local/python361/lib/python3.6/site-packages/prompt_toolkit-1.0.14-py3.6.egg‘, ‘/usr/local/python361/lib/python3.6/site-packages/traitlets-4.3.2-py3.6.egg‘, ‘/usr/local/python361/lib/python3.6/site-packages/simplegeneric-0.8.1-py3.6.egg‘, ‘/usr/local/python361/lib/python3.6/site-packages/pickleshare-0.7.4-py3.6.egg‘, ‘/usr/local/python361/lib/python3.6/site-packages/decorator-4.0.11-py3.6.egg‘, ‘/usr/local/python361/lib/python3.6/site-packages/jedi-0.10.2-py3.6.egg‘, ‘/usr/local/python361/lib/python3.6/site-packages/ptyprocess-0.5.1-py3.6.egg‘, ‘/usr/local/python361/lib/python3.6/site-packages/wcwidth-0.1.7-py3.6.egg‘, ‘/usr/local/python361/lib/python3.6/site-packages/six-1.10.0-py3.6.egg‘, ‘/usr/local/python361/lib/python3.6/site-packages/ipython_genutils-0.2.0-py3.6.egg‘, ‘/usr/local/python361/lib/python3.6/site-packages/ipython-6.1.0-py3.6.egg/IPython/extensions‘, ‘/root/.ipython‘]


例,新建一個模塊,讓程序能夠搜索到該模塊文件

[[email protected] ~]# mkdir -pv /opt/python361/ 
mkdir: created directory `/opt/python361/‘
[[email protected] ~]# touch /opt/python361/mymod.py
[[email protected] ~]# vim /opt/python361/mymod.py
#! /usr/bin/python36
#
a = 10
def printInfo():
    print a + 30
class Mym():
    im = ‘hello Mym‘
    def __init__(self,x):
        self.name = x
    def printName(self):
        print self.im, self.name


直接導入會搜索不到

In [13]: import mymod
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
<ipython-input-13-7215bcbec8da> in <module>()
----> 1 import mymod
ModuleNotFoundError: No module named ‘mymod‘


添加sys.path路徑

In [14]: sys.path.append(‘/opt/python361‘)
In [15]: import mymod
In [16]:
In [17]: print (mymod.a)
10

2.編譯成字節碼:文件導入時就會編譯,因此,頂層文件的.pyc字節碼文件在內部使用後會被丟棄,只有被導入的文件才會留下.pyc文件

3.執行模塊的代碼來創建其所定義的對象:執行裏面的頂層文件


如果一個模塊被導入,則__name__屬性保存的是自己的模塊名稱

如果不是被導入,而是自己執行,則__name__屬性保存的是__main__

[[email protected] python361]# cat /opt/python361/mymod.py 
#! /usr/bin/python36
#
a = 10
def printInfo():
    print a + 30
class Mym():
    im = ‘hello Mym‘
    def __init__(self,x):
        self.name = x
    def printName(self):
        print self.im, self.name
if __name__ == ‘__main__‘:           ##自我測試測試代碼
    printInfo()
    ins1 = Mym(‘jerry‘)
    print ins1.im
    print ins1.name
In [27]: mymod.__name__
Out[27]: ‘mymod‘
[[email protected] python361]# python mymod.py 
40
hello Mym
jerry



註意:

第一次導入才會執行三個步驟,重復導入沒有意義,只是在內存中提取已加載的模塊。

reload()可用於重新加載模塊


本文出自 “謝育政” 博客,請務必保留此出處http://kurolz.blog.51cto.com/11433546/1935028

Python學習筆記-模塊