摘要:需要解決的問題在編寫代碼的過程中,為了更好的管理代碼,我們會使用到包模塊類函數。所以用把里的成員,加入這是一個包內部的函數最終就可以實現我們前面所期望的導入方式了。
需要解決的問題
在編寫Python代碼的過程中,為了更好的管理代碼,我們會使用到包(package)、模塊(module)、類(class)、函數(function)。
介紹一下這幾個概念:
首先是模塊,module可以簡單理解為就是一個.py文件,這個文件里面可以包含類、變量、常量和函數等;
然后是包,簡單理解含有__init__.py的目錄就算是一個包,需要明確的是在python中包其實是一種特殊的模塊,但模塊并不是包。原因其實很簡單,sys.modules我們獲取到的結果中包含包和模塊,而module.__package__則會獲取到包的信息;
最后是類(函數在這里就不說了),類會寫在.py文件中,一般為了控制文件的大小,通常將一個或幾個有關聯的類寫在一個文件中。當然個人還是覺得一個類獨占一個文件比較好,除非你想看見一大堆亂糟糟的代碼擠在一個超大的文件里。
然后再來看看我們日常使用包、模塊和類的做法
# 目錄結構 #|--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__] = [] _packet_[package.__name__].append(func.__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()
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41703.html
摘要:內存池機制提供了對內存的垃圾收集機制,但是它將不用的內存放到內存池而不是返回給操作系統。為了加速的執行效率,引入了一個內存池機制,用于管理對小塊內存的申請和釋放。 注:答案一般在網上都能夠找到。1.對if __name__ == main的理解陳述2.python是如何進行內存管理的?3.請寫出一段Python代碼實現刪除一個list里面的重復元素4.Python里面如何拷貝一個對象?...
摘要:一介紹是宜信公司團隊開發的一款數據庫審核產品,可幫助開發人員快速發現數據庫質量問題,提升工作效率。此平臺可實現對數據庫進行多維度對象結構文本執行計劃及執行特征的審核,用以評估對象結構設計質量及運行效率。執行計劃指數據庫中的執行計劃。 一、介紹 Themis是宜信公司DBA團隊開發的一款數據庫審核產品,可幫助DBA、開發人員快速發現數據庫質量問題,提升工作效率。其名稱源自希臘神話中的正義...
閱讀 1809·2019-08-30 13:54
閱讀 2725·2019-08-29 17:27
閱讀 1109·2019-08-29 17:23
閱讀 3350·2019-08-29 15:20
閱讀 1225·2019-08-29 11:28
閱讀 1566·2019-08-26 10:39
閱讀 1315·2019-08-26 10:29
閱讀 639·2019-08-26 10:13