1. 程式人生 > >Python知識點記錄二(包和模塊)

Python知識點記錄二(包和模塊)

test .py 導入模塊 有一個 如果 int AS 普通 結果

包和模塊

1、Python項目的組織結構

Python最頂級的層級是包,模塊即是包下的各個python文件。從組織的層面考慮,模塊應該為各種功能“類”。

2、包和文件夾的不同

*包在形式上就是一個文件夾,但作為包,包內必須含有一個“__init__.py”模塊,同時這個“__init__.py”在Python解釋器運行時其名字就是包名。

*當一個包被導入,或者該包內的某個模塊,或者該包下某個模塊內的變量/函數被導入的時候,包內的__init__模塊會被解釋器自動運行。

*在包內的__init__.py內可以通過定義__all__ = [‘包內模塊名‘的字符串列表],設置包內哪些模塊可以被外部導入。

3、import、from/import的用法

*對於直接使用import的導入方法,import後面只能跟模塊名,不能直接導入模塊內的變量或函數等!

*可以通過from/import的方式直接導入模塊內的變量或函數等。如包test下的模塊x中的變量m可以用以下方式導入使用:

import test.x
print(test.x.m)

from test.x import m
print(m)

from test import x
print(x.m)

*如果要導入包test下模塊x中的所有變量、函數;那麽可以用:from test import * 。但不推薦這種方法,這會使得導入不夠明確。

如果要導入模塊x中的部分變量,則可以在模塊x中通過設置__all__=[可導入變量/函數名組成的字符串列表]

__all__ = [a,c]  
a = 2
c = 3
d = 5  #d不在_all_列表中,所以無法導入其他模塊中使用

或者直接:from test import a,c

4、模塊內置函數

任意模塊的內置函數可以通過dir()方法顯示。

#模塊
a = 1
print(dir())
#打印出上述模塊的內置變量
#其中可以發現變量a為自定義的變量,其余為系統自帶的變量
[__annotations__, __builtins__, __cached__
, __doc__, __file__, __loader__, __name__, __package__, __spec__, a]

(1)__name__:當前的模塊名稱。當該模塊本身為入口模塊時,名稱會變成‘__main__‘。

(2)__package__:當前模塊所屬的包名,當模塊為入口模塊時,則不存在其上層的頂級包,則返回None。

(3)__doc__:當前模塊的文檔註釋,如果模塊沒有文檔註釋,則返回None。

(4)__file__:當前模塊的路徑信息。

#t.t1.c9
‘‘‘This is T-t1-c9‘‘‘
print(t-t1-c9-NAME:+__name__)
print(t-t1-c9-PACKAGE:+(__package__ or 當前模塊不屬於任何包))
print(t-t1-c9-DOC:+(__doc__ or 當前模塊沒有文檔註釋))
print(t-t1-c9-FILE:+__file__)

#t.c15
import t.t1.c9

print(t-c15-NAME:+__name__)
print(t-c15-PACKAGE:+(__package__ or 當前模塊不屬於任何包))
print(t-c15-DOC:+(__doc__ or 當前模塊沒有文檔註釋))
print(t-c15-FILE:+__file__)

#運行c15的結果:
‘‘‘
This is __init__.py file of PACKAGE t.
t-t1-c9-NAME:t.t1.c9
t-t1-c9-PACKAGE:t.t1
t-t1-c9-DOC:This is T-t1-c9
t-t1-c9-FILE:D:\...\seven\t\t1\c9.py
t-c15-NAME:__main__
t-c15-PACKAGE:當前模塊不屬於任何包
t-c15-DOC:當前模塊沒有文檔註釋
t-c15-FILE:D:\...seven\c15.py

5、__name__變量的經典應用

#Make a script both importable or excutable
#使得一個模塊既可以作為普通模塊也可以作為可執行程序
if __name__ == __main__:
    pass
 
#c17

if __name__ == __main__:
    print(This is app.)

print(This is a module.)
 
#c16

import c17

print(test)

#運行c16的結果:
This is a module.
test


#運行c17的結果:
This is app.
This is a module.

6、相對導入和絕對導入

任意模塊其所屬的頂級包,都和當前入口程序相關,模塊的頂級包最多只上升到入口程序的平級層次。

入口程序不屬於任意包。

如果有一個python項目,其包括main.py和package1、package2、package3;其中package2包中又有package4包,package4包內有模塊m2.py。

如果以main.py作為入口文件,其中需要導入m2模塊,則:

#main.py
#這裏的“package2.package4.m2”即為絕對導入
import package2.package4.m2

對於相對導入:一個點‘.‘表示當前目錄,兩個點‘..‘表示當前目錄上一層目錄,三個點‘...‘表示當前目錄上上層目錄,以此類推。

在入口程序中不能使用相對導入,因為相對路徑能找到對應模塊是在於其會通過所在模塊的‘__name__‘來定位;而對於入口文件,其__name__會被改成‘__main__‘,在目錄中是找不到‘__main__‘這個文件的。

import導入語法也不能使用相對導入,只能在from/import中使用。

#絕對導入一定是從頂級包開始
import package2.package4.m2

#相對導入
#導入該模塊同級目錄下m3模塊的變量a
from .m3 import a

#導入該模塊統計目錄下package5包下m3包下的變量a
from .package5.m3 import a

#導入該模塊同級目錄下package5包下的m3模塊
from .package5 import m3

#導入該模塊上級目錄下m4模塊內的p變量
from ..m4 import p

Python知識點記錄二(包和模塊)