摘要:需要解決的問(wèn)題在編寫代碼的過(guò)程中,為了更好的管理代碼,我們會(huì)使用到包模塊類函數(shù)。所以用把里的成員,加入這是一個(gè)包內(nèi)部的函數(shù)最終就可以實(shí)現(xiàn)我們前面所期望的導(dǎo)入方式了。
需要解決的問(wèn)題
在編寫Python代碼的過(guò)程中,為了更好的管理代碼,我們會(huì)使用到包(package)、模塊(module)、類(class)、函數(shù)(function)。
介紹一下這幾個(gè)概念:
首先是模塊,module可以簡(jiǎn)單理解為就是一個(gè).py文件,這個(gè)文件里面可以包含類、變量、常量和函數(shù)等;
然后是包,簡(jiǎn)單理解含有__init__.py的目錄就算是一個(gè)包,需要明確的是在python中包其實(shí)是一種特殊的模塊,但模塊并不是包。原因其實(shí)很簡(jiǎn)單,sys.modules我們獲取到的結(jié)果中包含包和模塊,而module.__package__則會(huì)獲取到包的信息;
最后是類(函數(shù)在這里就不說(shuō)了),類會(huì)寫在.py文件中,一般為了控制文件的大小,通常將一個(gè)或幾個(gè)有關(guān)聯(lián)的類寫在一個(gè)文件中。當(dāng)然個(gè)人還是覺(jué)得一個(gè)類獨(dú)占一個(gè)文件比較好,除非你想看見一大堆亂糟糟的代碼擠在一個(gè)超大的文件里。
然后再來(lái)看看我們?nèi)粘J褂冒?、模塊和類的做法
# 目錄結(jié)構(gòu) #|--demo.py #|--package_a # |--__init__.py # |--class_a.py 類ClassA # |--class_b.py 類ClassB # ./demo.py # 導(dǎo)入方式一 from package_a.class_a import ClassA from package_a.class_a import ClassB a = ClassA() b = ClassB() # 導(dǎo)入方式二 import package_a.class_a as ca import package_a.class_b as cb a = ca.ClassA() b = cb.ClassB()
好的,我們的問(wèn)題來(lái)了,怎么樣才能減少我們導(dǎo)入部分的代碼呢?或者說(shuō)怎么樣才能使得一些相關(guān)聯(lián)的模塊不需要一個(gè)一個(gè)的進(jìn)行導(dǎo)入呢?最終實(shí)現(xiàn)到下面的樣子是不是會(huì)更好
# ./demo.py from package_a import * a = ClassA() b = ClassB()解決的方法
# ./common.py import sys _packet_ = {} # 裝飾器,func是類或者函數(shù) def export(func): module = sys.modules[func.__module__] # 獲取func的模塊對(duì)象 package = sys.modules[module.__package__] # 由模塊對(duì)象得到包對(duì)象 package.__dict__[func.__name__] = func # 把func添加到包的__dict__里 # 生成所有使用該解決方案的包的__all__變量,并把導(dǎo)出的func添加進(jìn)去 if not package.__name__ in _packet_: _packet_[package.__name__] = [] _packet_[package.__name__].append(func.__name__) # 原封不動(dòng)地把func返回 return func # 在包的__init__.py里用于獲取__all__ def packet(name): if not name in _packet_: _packet_[name] = [] return _packet_[name]實(shí)際使用
# 目錄結(jié)構(gòu) #|--common.py(就是上面的裝飾器文件) #|--demo.py #|--package_a # |--__init__.py # |--class_a.py 類ClassA # |--class_b.py 類ClassB
首先在模塊中處理我們創(chuàng)建的類
# ./package_a/class_a.py import common # 使用export裝飾器,裝飾要導(dǎo)出的類或函數(shù) @common.export class ClassB(object): def __init__(self): print "This is ClassB."
然后在包的__init__.py中修改包自身
# ./package_a/__init__.py import common # 注意,這步很重要!!!導(dǎo)入將要導(dǎo)出的子模塊,需要具體模塊名字,此處import * 不可用 from . import class_a, class_b # 用packet初始化包的__all__,主要是用于支持 "from . import *" 導(dǎo)入 __all__ = common.packet(__name__) # 因?yàn)橛胈_all__會(huì)影響"from . import *"。所以用export把__init__.py里的成員,加入__all__ @common.export def pafunc(): """ 這是一個(gè)包內(nèi)部的函數(shù) """ print("pafunc")
最終就可以實(shí)現(xiàn)我們前面所期望的導(dǎo)入方式了。
# ./demo.py from package_a import * a = ClassA()
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/41703.html
摘要:內(nèi)存池機(jī)制提供了對(duì)內(nèi)存的垃圾收集機(jī)制,但是它將不用的內(nèi)存放到內(nèi)存池而不是返回給操作系統(tǒng)。為了加速的執(zhí)行效率,引入了一個(gè)內(nèi)存池機(jī)制,用于管理對(duì)小塊內(nèi)存的申請(qǐng)和釋放。 注:答案一般在網(wǎng)上都能夠找到。1.對(duì)if __name__ == main的理解陳述2.python是如何進(jìn)行內(nèi)存管理的?3.請(qǐng)寫出一段Python代碼實(shí)現(xiàn)刪除一個(gè)list里面的重復(fù)元素4.Python里面如何拷貝一個(gè)對(duì)象?...
摘要:一介紹是宜信公司團(tuán)隊(duì)開發(fā)的一款數(shù)據(jù)庫(kù)審核產(chǎn)品,可幫助開發(fā)人員快速發(fā)現(xiàn)數(shù)據(jù)庫(kù)質(zhì)量問(wèn)題,提升工作效率。此平臺(tái)可實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)進(jìn)行多維度對(duì)象結(jié)構(gòu)文本執(zhí)行計(jì)劃及執(zhí)行特征的審核,用以評(píng)估對(duì)象結(jié)構(gòu)設(shè)計(jì)質(zhì)量及運(yùn)行效率。執(zhí)行計(jì)劃指數(shù)據(jù)庫(kù)中的執(zhí)行計(jì)劃。 一、介紹 Themis是宜信公司DBA團(tuán)隊(duì)開發(fā)的一款數(shù)據(jù)庫(kù)審核產(chǎn)品,可幫助DBA、開發(fā)人員快速發(fā)現(xiàn)數(shù)據(jù)庫(kù)質(zhì)量問(wèn)題,提升工作效率。其名稱源自希臘神話中的正義...
閱讀 1861·2019-08-30 13:54
閱讀 2772·2019-08-29 17:27
閱讀 1172·2019-08-29 17:23
閱讀 3396·2019-08-29 15:20
閱讀 1288·2019-08-29 11:28
閱讀 1629·2019-08-26 10:39
閱讀 1399·2019-08-26 10:29
閱讀 710·2019-08-26 10:13