今天犯了一個很蠢的錯誤,有關python的模塊包的使用的

在引用自己構造模塊包時,總是不成功

 

from XXXLib.Pub import *

dumpString("XXXX......")

總是報:NameError: name 'dumpString' is not defined

 

後來纔想到是沒有引用到具體的模塊:

from XXXLib.Pub.shareDef import *

dumpString("XXXX......")

 

藉此機會再來回顧一下如何構造自己的模塊包:


首先創建一個Package(我用的是Eclipse IDE)

然後再創建子包,記得用Package.SubPackage的方式命名

然後再創建子包裏的Python模塊,就是一個個py文件

在每個包的下面創建一個空的__init__.py文件,表示該目錄爲python的包


然後就可以在別的py文件中引用包中的函數了,引用方式是

from Package.SubPackage.Module import *

==================================

 

Python模塊包中__init__.py文件的作用

http://hi.baidu.com/nkhzj/blog/item/a6f0df00b2c39716728b65f1.html

模塊包:

包通常總是一個目錄,目錄下爲首的一個文件便是 __init__.py。然後是一些模塊文件和子目錄,假如子目錄中也有 __init__.py 那麼它就是這個包的子包了。差不多就像這樣吧:

Package1/ __init__.py

Module1.py

Module2.py

Package2/ __init__.py

Module1.py

Module2.py

我們可以就這樣導入一個包:

import
 Package1

或者調入一個子模塊和子包:

from
 Package1 import
 Module1

from
Package1 import Package2

import
Packag1.Module1

import
Packag1.Package2

可以深入好幾層包結構:

from
 Package1.Package2 import
 Module1

import
Package1.Package2.Module1

大致就這樣吧,我覺得,包的精髓應該是在 __init__.py 這個文件之中的。



__init__.py 文件:

__init__.py 控制着包的導入行爲。假如 __init__.py 爲空,那麼僅僅導入包是什麼都做不了的。

>>>
 import
 Package1

>>>
Package1.Module1

Traceback (most recent call last):
File "<pyshell#1>", line 1, in ?
Package1.Module1

AttributeError: 'module' object has no attribute 'Module1'

我們需要在 __init__.py 裏把 Module1 預先導入:

#文件 __init__.py


import
Module1

測試:

>>>
 import
 Package1

>>>
Package1.Module1

<module 'Package1.Module1' from
'Module.pyc'>

__init__.py 中還有一個重要的變量,叫做 __all__。我們有時會使出一招“全部導入”,也就是這樣:

from
 PackageName import
 *

這時 import 就會把註冊在包 __init__.py 文件中 __all__ 列表中的子模塊和子包導入到當前作用域中來。比如:

#文件 __init__.py


__all__ = ['Module1' , 'Module2' , 'Package2' ]

測試:

>>>
 from
 Package1 import
 *

>>>
Module2

<module 'Package1.Module2' from 'Module.pyc'>

__init__.py 文件會在導入時被執行。

發佈了30 篇原創文章 · 獲贊 8 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章