在編寫python**的過程中,為了更好的管理**,我們會使用到包(package)、模組(module)、類(class)、函式(function)。
介紹一下這幾個概念:
然後再來看看我們日常使用包、模組和類的做法
# 目錄結構
#|--demo.py
#|--package_a
# |--__init__.py
# |--class_a.py 類classa
# |--class_b.py 類classb
# ./demo.py
# 匯入方式一
from package_a.class_a import classa
from package_a.class_a import classb
a = classa()
b = classb()
# 匯入方式二
import package_a.class_a as ca
import package_a.class_b as cb
a = ca.classa()
b = cb.classb()
好的,我們的問題來了,怎麼樣才能減少我們匯入部分的**呢?或者說怎麼樣才能使得一些相關聯的模組不需要乙個乙個的進行匯入呢?最終實現到下面的樣子是不是會更好
# ./demo.py
from package_a import *
a = classa()
b = classb()
# ./common.py
import sys
_packet_ = {}
# 裝飾器,func是類或者函式
def export(func):
module = sys.modules[func.__module__] # 獲取func的模組物件
package = sys.modules[module.__package__] # 由模組物件得到包物件
package.__dict__[func.__name__] = func # 把func新增到包的__dict__裡
# 生成所有使用該解決方案的包的__all__變數,並把匯出的func新增進去
if not package.__name__ in _packet_:
_packet_[package.__name__] =
# 原封不動地把func返回
return func
# 在包的__init__.py裡用於獲取__all__
def packet(name):
if not name in _packet_:
_packet_[name] =
return _packet_[name]
# 目錄結構
#|--common.py(就是上面的裝飾器檔案)
#|--demo.py
#|--package_a
# |--__init__.py
# |--class_a.py 類classa
# |--class_b.py 類classb
首先在模組中處理我們建立的類
# ./package_a/class_a.py
import common
# 使用export裝飾器,裝飾要匯出的類或函式
@common.export
class classb(object):
def __init__(self):
print 'this is classb.'
然後在包的__init__.py中修改包自身
# ./package_a/__init__.py
import common
# 注意,這步很重要!!!匯入將要匯出的子模組,需要具體模組名字,此處import * 不可用
from . import class_a, class_b
# 用packet初始化包的__all__,主要是用於支援 "from . import *" 匯入
__all__ = common.packet(__name__)
# 因為用__all__會影響"from . import *"。所以用export把__init__.py裡的成員,加入__all__
@common.export
def pafunc():
""" 這是乙個包內部的函式 """
print('pafunc')
最終就可以實現我們前面所期望的匯入方式了。
# ./demo.py
from package_a import *
a = classa()
python類 模組 包
通常包總是乙個目錄,可以使用import匯入包,或者from import來匯入包中的部分模組。包目錄下為首的乙個檔案便是 init py。然後是一些模組檔案和子目錄,假如子目錄中也有 init py 那麼它就是這個包的子包了。在建立許許多多模組後,我們可能希望將某些功能相近的檔案組織在同一資料夾下...
Python包與模組管理
import module 匯入模組 from module import a 匯入模組中的變數或方法 from module import 匯入模組中所有的變數或方法模組是乙個 py檔案 裡面可能含有多個變數及方法,使用 import 模組名 匯入模組後,模組中的變數或方法可以通過 模組名.變數名...
Python類 模組 包的概念及區別
類 類的概念在許多語言 現,是物件導向程式設計的基礎,很容易理解。抽象出不同物體的共同特徵,根據相似性原則,把彼此相似的物體歸於相同的類概念,它將資料和操作進行封裝,以便將來的復用。模組模組,在python中乙個檔案就可以認為是乙個模組。在建立了乙個指令碼檔案後,定義了某些函式和變數。你在其他需要這...