Python包、模塊署驻、類和代碼文件目錄的管理方案

1.要解決的問(wèn)題

Python在語(yǔ)義中存在著包奋献、模塊健霹、類(當(dāng)然還有函數(shù))這幾個(gè)概念。

在編寫Python代碼時(shí)瓶蚂,我們需要管理代碼的文件目錄結(jié)構(gòu)糖埋。

這時(shí)候會(huì)遇到這樣一種情況:

1.由于Python一個(gè)文件算一個(gè)模塊,一個(gè)帶__init__.py的目錄算一個(gè)包窃这。

2.而為了控制代碼文件不要過(guò)大瞳别,我們需要的是一個(gè)類(幾個(gè)類或加些許函數(shù))分配一個(gè)文件

3.這時(shí)候會(huì)出現(xiàn)類似這樣的語(yǔ)句:

#第一種

importpackage_a.class_a_fileascaf

a=caf.ClassA()

#第二種

formpackage_a.class_a_file import *

a=ClassA()

#另外幾種就不意義列舉了...

以上除了直觀上可以看出import過(guò)長(zhǎng)外杭攻,隱藏的另一點(diǎn)是我們是希望一個(gè)類用一個(gè)文件祟敛,在使用多個(gè)相關(guān)類的時(shí)候就必須寫很多import。(注:我們可不想一堆代碼扎堆兆解,弄出一個(gè)超大代碼文件馆铁。)

2.解決方案要達(dá)到的效果

#文件目錄結(jié)構(gòu)

#|--demo.py

#|--package_a

#?? |--__init__.py

#?? |--class_a.py??#類ClassA

#?? |--class_b.py??#類ClassB和函數(shù)func_b()

#demo.py中可以直接使用

from package_a import *

a=ClassA()

b=ClassB()

func_b()

由于Python里一個(gè)帶__init__.py的目錄算一個(gè)包,所以利用這一機(jī)制锅睛,把類文件放在包里埠巨,用包來(lái)管理類。

注:在Python里“包是模塊现拒,而模塊不是包”辣垒。用system.modules可以取到的名字是包和模塊都有的,而用__package__卻能很好的區(qū)分包和模塊具练。也就是“包其實(shí)是一種特殊的模塊”乍构。

3.解決方案

這就是解決方案的文件base.py甜无,代碼很短:

import sys

_packet_={}

#它是個(gè)裝飾器扛点,item是類,或者函數(shù)

def export(item):

#獲取item的模塊對(duì)象

module=sys.modules[item.__module__]

#由模塊對(duì)象得到包對(duì)象

package=sys.modules[module.__package__]

#把item添加到包的__dict__里

package.__dict__[item.__name__]=item

#生成所有使用該解決方案的包的__all__變量岂丘,并把導(dǎo)出的item添加進(jìn)去

ifnotpackage.__name__in_packet_:

_packet_[package.__name__]=[]

_packet_[package.__name__].append(item.__name__)

#原封不動(dòng)地把item返回

returnitem

#它是個(gè)函數(shù)陵究,在包__init__.py里用于獲取__all__

def packet(name):

ifnotnamein_packet_:

_packet_[name]=[]

return_packet_[name]

代碼用意我寫在注釋里了,就是以裝飾器來(lái)把類添加到包的__dict__和__all__里奥帘。__all__需要利用packet在包里生成铜邮,不這么做只會(huì)使得from package_name import * 后不能找到類,需要寫具體的類名from package_name import ClassA寨蹋。

4.使用解決方案

先來(lái)看下使用解決方案后的目錄結(jié)構(gòu):

#文件目錄結(jié)構(gòu)(使用后結(jié)構(gòu)只多了base.py)

#|--base.py

#|--demo.py

#|--package_a

#?? |--__init__.py

#?? |--class_a.py??#類ClassA

#?? |--class_b.py??#類ClassB和函數(shù)func_b()

代碼處就需要做到以下幾點(diǎn):

1.關(guān)于被導(dǎo)出的類文件里應(yīng)該怎么做松蒜,這里以class_b.py為例子:

# ./package_a/class_b.py

#1.需要導(dǎo)入base

importbase

#2.使用export裝飾器,裝飾要導(dǎo)出的類或函數(shù)

@base.export

classClassB:pass

#2.同樣的export可以導(dǎo)出函數(shù)

@base.export

def func_b():

print('func_b')

2.使用了導(dǎo)出功能的包要做什么,這里以package_a包為例:

# ./package_a/__init__.py

#1.導(dǎo)入base

importbase

#2.導(dǎo)入將要導(dǎo)出的子模塊,需要具體模塊名字的形式已旧,from . import * 不可用

from.importclass_a,class_b

#3.用packet初始化__all__,這個(gè)可選秸苗,主要是看要不要支持 from 的用 * 導(dǎo)入

__all__=base.packet(__name__)

#4.這個(gè)是可選的,因?yàn)槿绻昧薩_all__會(huì)影響from *运褪【ィ可以用export把__init__.py里的項(xiàng)玖瘸,加入__all__

@base.export

def pafunc():

print('pafunc')

5.總結(jié)

使用該解決方案可以歸納為兩點(diǎn):

1.用@base.export標(biāo)記要導(dǎo)出的類或函數(shù)

2.在包__init__.py里初始化__all__ = base.packet(__name__)

3.(說(shuō)好的只有兩點(diǎn)呢?)其實(shí)第2點(diǎn)是可選的檀咙,不過(guò)最好加上雅倒。而在包的__init__.py里導(dǎo)入子模塊才是真正的第2點(diǎn)。不然子模塊不會(huì)被載入弧可,也談不上導(dǎo)出了蔑匣。

最后,demo.py里可以這么寫棕诵,和預(yù)期的效果一樣:)

# ./demo.py

from package_a import *

a=ClassA()# 上面的實(shí)例沒(méi)有給出殖演,不過(guò)假設(shè)有ClassA在class_a.py里的

b=ClassB()

func_b()學(xué)好python你需要一個(gè)良好的環(huán)境,一個(gè)優(yōu)質(zhì)的開(kāi)發(fā)交流群年鸳,群里都是那種相互幫助的人才是可以的趴久,我有建立一個(gè)python學(xué)習(xí)交流群,在群里我們相互幫助搔确,相互關(guān)心彼棍,相互分享內(nèi)容,這樣出問(wèn)題幫助你的人就比較多膳算,群號(hào)是304加上050最後799座硕,這樣就可以找到大神聚合的群,如果你只愿意別人幫助你涕蜂,不愿意分享或者幫助別人华匾,那就請(qǐng)不要加了,你把你會(huì)的告訴別人這是一種分享机隙。無(wú)論是學(xué)習(xí)任何一門語(yǔ)言蜘拉,基礎(chǔ)知識(shí),就是基礎(chǔ)功非常的重要有鹿,找一個(gè)有豐富編程經(jīng)驗(yàn)的老師或者師兄帶著你會(huì)少走很多彎路旭旭, 你的進(jìn)步速度也會(huì)快很多,無(wú)論我們學(xué)習(xí)的目的是什么葱跋,不得不說(shuō)Python真的是一門值得你付出時(shí)間去學(xué)習(xí)的優(yōu)秀編程

語(yǔ)言持寄。

感覺(jué)寫的好,對(duì)你有幫助娱俺,就點(diǎn)個(gè)贊唄稍味,別光只收藏哈.~( ̄▽ ̄)~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市荠卷,隨后出現(xiàn)的幾起案子模庐,更是在濱河造成了極大的恐慌速种,老刑警劉巖动分,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡碘饼,警方通過(guò)查閱死者的電腦和手機(jī)袜刷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門父丰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)甥厦,“玉大人,你說(shuō)我怎么就攤上這事悴了〔簦” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵湃交,是天一觀的道長(zhǎng)熟空。 經(jīng)常有香客問(wèn)我,道長(zhǎng)搞莺,這世上最難降的妖魔是什么息罗? 我笑而不...
    開(kāi)封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮才沧,結(jié)果婚禮上迈喉,老公的妹妹穿的比我還像新娘。我一直安慰自己温圆,他們只是感情好挨摸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著岁歉,像睡著了一般得运。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锅移,一...
    開(kāi)封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天熔掺,我揣著相機(jī)與錄音,去河邊找鬼帆啃。 笑死瞬女,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的努潘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼坤学,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼疯坤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起深浮,我...
    開(kāi)封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤压怠,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后飞苇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體菌瘫,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜗顽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雨让。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雇盖。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖栖忠,靈堂內(nèi)的尸體忽然破棺而出崔挖,到底是詐尸還是另有隱情,我是刑警寧澤庵寞,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布狸相,位于F島的核電站,受9級(jí)特大地震影響捐川,放射性物質(zhì)發(fā)生泄漏脓鹃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一古沥、第九天 我趴在偏房一處隱蔽的房頂上張望将谊。 院中可真熱鬧,春花似錦渐白、人聲如沸尊浓。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)栋齿。三九已至,卻和暖如春襟诸,著一層夾襖步出監(jiān)牢的瞬間瓦堵,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工歌亲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留菇用,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓陷揪,卻偏偏與公主長(zhǎng)得像惋鸥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悍缠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 類 類的概念在許多語(yǔ)言中出現(xiàn),很容易理解趴拧。它將數(shù)據(jù)和操作進(jìn)行封裝溅漾,以便將來(lái)的復(fù)用山叮。 模塊 模塊,在Python可理...
    隨風(fēng)化作雨閱讀 1,894評(píng)論 0 5
  • Python類汰现、模塊、包的區(qū)別 類類的概念在許多語(yǔ)言中出現(xiàn)叔壤,很容易理解瞎饲。它將數(shù)據(jù)和操作進(jìn)行封裝,以便將來(lái)的復(fù)用炼绘。模...
    周倜吉閱讀 5,262評(píng)論 0 3
  • 朋友的孩子是個(gè)非常優(yōu)秀的女生嗅战,從小到大,年級(jí)第一名是她的標(biāo)榜俺亮,各類比賽也是屢屢得獎(jiǎng)驮捍,就連大學(xué),研究生都是保送脚曾,長(zhǎng)的...
    榕莎莎閱讀 512評(píng)論 0 1
  • 單曲循環(huán)了三天的歌 今天終于去看了電影 有點(diǎn)浮夸 可是感情很細(xì)膩 很細(xì)微 很純真 很好看 還有 今天下了初...
    MaoMaoMei閱讀 312評(píng)論 5 0
  • 這是一本很短的戲劇劇本东且,大概講述了一個(gè)出軌流言的故事。 胡立安收養(yǎng)埃內(nèi)斯托為養(yǎng)子本讥,卻傳出埃內(nèi)斯托與其養(yǎng)母珊泳,也就是自...
    隨風(fēng)銘記閱讀 1,973評(píng)論 0 1