python第50課練習(xí)—模塊:模塊就是程序

0、說(shuō)到底洽损,Python 的模塊是什么革半?

答:模塊就是程序碑定。沒(méi)錯(cuò)又官,所謂模塊就是平時(shí)我們寫的任何代碼,然后保存的每一個(gè) “.py” 結(jié)尾的文件碘赖,都是一個(gè)獨(dú)立的模塊外构。

1普泡、我們現(xiàn)在有一個(gè) hello.py 的文件审编,里邊有一個(gè) hi() 函數(shù):

def hi():
    print('Hi everyone, i love FishC.com!')

請(qǐng)問(wèn)我如何在另一個(gè)源文件 test.py 里邊使用 hello.py 的 hi() 函數(shù)呢?

答:只需要在 test.py 中導(dǎo)入 hello 模塊(文件名 = 模塊名)即可使用 hello.py 中的 hi() 函數(shù)砰嘁。

2、你知道的總共有幾種導(dǎo)入模塊的方法矮湘?

答:我們總共介紹了三種導(dǎo)入模塊的方法:

  • 第一種:import 模塊名
  • 第二種:from 模塊名 import 函數(shù)名
  • 第三種:import 模塊名 as 新名字

3、曾經(jīng)我們講過(guò)有辦法阻止 from...import * 導(dǎo)入你的“隱私”屬性板祝,你還記得是怎么做到的嗎?

答:如果你不想模塊中的某個(gè)屬性被 from...import * 導(dǎo)入孤里,那么你可以給你不想導(dǎo)入的屬性名稱前邊加上一個(gè)下劃線( _ )橘洞。不過(guò)需要注意的是,如果使用 import ... 導(dǎo)入整個(gè)模塊炸枣,或者顯示的使用 import xx._oo 導(dǎo)入某個(gè)屬性,那么這個(gè)隱藏方法就不起作用了适肠。

4、倘若有 a.py 和 b.py 兩個(gè)文件敦跌,內(nèi)容如下:

# a.py
def sayHi():
    print("嗨逛揩!我是A模塊!")

# b.py
def sayHi():
    print("嗨!我是B模塊辩稽!")

那么我在 test.py 文件中執(zhí)行以下操作,會(huì)打印什么結(jié)果逞泄?

# test.py
from a import sayHi
from b import sayHi

sayHi()

答:會(huì)打印“嗨!我是B模塊各谚!”侮腹,因?yàn)榈诙螌?dǎo)入的 b 模塊把 a 模塊的同名函數(shù) sayHi() 給覆蓋了稻励,這就是所謂命名空間的沖突父阻。所以,在項(xiàng)目中履婉,特別是大型項(xiàng)目中,我們應(yīng)該避免使用 from...import... 仇冯,除非你非常明確不會(huì)造成命名沖突已烤。

5妓羊、執(zhí)行下邊 a.py 和 b.py 任何一個(gè)文件,都會(huì)報(bào)錯(cuò)躁绸,請(qǐng)嘗試解釋一下此現(xiàn)象。

# a.py
from b import y
def x():
    print('x')

# b.py
from a import x
def y():
    print('y')
image.png

答:這是個(gè)循環(huán)嵌套導(dǎo)入問(wèn)題剥哑。無(wú)論運(yùn)行 a.py 和 b.py 哪一個(gè)文件都會(huì)拋出 ImportError 異常淹父。這是因?yàn)樵趫?zhí)行其中某一個(gè)文件(a.py)的加載過(guò)程中,會(huì)創(chuàng)建模塊對(duì)象并執(zhí)行對(duì)應(yīng)的字節(jié)碼弹灭。但當(dāng)執(zhí)行第一個(gè)語(yǔ)句的時(shí)候需要導(dǎo)入另一個(gè)文件( from b import y ),因此CPU 會(huì)轉(zhuǎn)而去加載另一個(gè)文件(b.py)。同理逻翁,執(zhí)行另一個(gè)文件的第一個(gè)語(yǔ)句( from a import x )恰好也是需要導(dǎo)入之前的的文件(a.py)。此時(shí)八回,之前的文件處于僅導(dǎo)入第一條語(yǔ)句的階段驾诈,因此其對(duì)應(yīng)的字典中并不存在 x , 故拋出 “ImportError: cannot import name x” 異常。

解決方案時(shí)直接用 import 語(yǔ)句導(dǎo)入:

# a.py
import b
def x():
    print('x')

# b.py
import a
def y():
    print('y')

a.x()

這題沒(méi)操作出來(lái).....

練習(xí)

0乍迄、問(wèn)大家一個(gè)問(wèn)題:Python 支持常量嗎?相信很多魚油的答案都是否定的褥伴,但實(shí)際上Python 內(nèi)建的命名空間是支持一小部分常量的,比如我們熟悉的True重慢,F(xiàn)alse,None等, 只是Python 沒(méi)有提供定義常量的直接方式而已似踱。那么這一題的要求是創(chuàng)建一個(gè) const 模塊,功能是讓 Python 支持常量囚戚。

說(shuō)到這里大家可能還是一頭霧水,沒(méi)關(guān)系弯淘,我們舉個(gè)例子吉懊。

test.py 是我們的測(cè)試代碼,內(nèi)容如下:

# const 模塊就是這道題要求我們自己寫的
# const 模塊用于讓Python 支持常量操作

const.NAME = "FishC"
print(const.NAME)

try:
    # 嘗試修改變量
    const.NAME = "FishC.com"
except TypeError as Err:
    print(Err)

try:
    # 變量名需要大寫
    const.name = 'FishC'
except TypeError as Err:
    print(Err)

執(zhí)行后的結(jié)果是:

>>>
FishC
常量無(wú)法改變借嗽!
常量名必須由大寫字母組成!

在const 模塊中我們到底做了什么浆竭,使得這個(gè)模塊這么有魔力呢惨寿?大家跟著小甲魚的提示邦泄,一步步來(lái)做你就懂了:

  • 提示一:我們需要一個(gè)Const 類
  • 提示二:重寫Const 類的一個(gè)魔法方法裂垦,指定當(dāng)實(shí)例對(duì)象的屬性被修改時(shí)的行為。
  • 提示三:檢查該屬性是否已存在
  • 提示四:檢查該屬性的名字是否為大寫
  • 提示五:細(xì)心的魚油可能發(fā)現(xiàn)了特碳,怎么我們這個(gè)const 模塊導(dǎo)入之后就把它當(dāng)對(duì)象來(lái)使用(const.NAME = "FishC")了呢晕换?難道模塊也可以是一個(gè)對(duì)象午乓?沒(méi)錯(cuò)啦闸准,在Python 中無(wú)處不對(duì)象,到處都是你的對(duì)象夷家。使用以下方法可以將你的模塊與類A的對(duì)象掛鉤或辖。
'''sys.modules 是一個(gè)字典枣接,它包含了從Python 開始運(yùn)行
起缺谴,被導(dǎo)入的所有模塊。鍵就是模塊名湿蛔,值就是模塊對(duì)象'''
import sys
sys.modules[__name__] = A()

額...好像說(shuō)得有點(diǎn)太多了,大家一定要自己動(dòng)手先嘗試完成噢添谊。
代碼清單:

# 該模塊用于讓Python 支持常量操作
class   Const:
    def __setattr__(self,name,value):
        if name in self.__dict__:
            raise TypeError("常量無(wú)法改變察迟!")

        if not name.isupper():
            raise TypeError("常量名必須由大寫字母組成!")

        self.__dict__[name] = value

import sys
sys.modules[__name__] = Const()

注: 這題再看看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扎瓶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子秕岛,更是在濱河造成了極大的恐慌误证,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愈捅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡诈皿,警方通過(guò)查閱死者的電腦和手機(jī)像棘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)缕题,“玉大人,你說(shuō)我怎么就攤上這事烟零∠套鳎” “怎么了宵睦?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)桐智。 經(jīng)常有香客問(wèn)我烟馅,道長(zhǎng),這世上最難降的妖魔是什么郑趁? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮捆憎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘攻礼。我一直安慰自己栗柒,他們只是感情好礁扮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布太伊。 她就那樣靜靜地躺著逛钻,像睡著了一般僚焦。 火紅的嫁衣襯著肌膚如雪曙痘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天名扛,我揣著相機(jī)與錄音茧痒,去河邊找鬼肮韧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛超燃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播意乓,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼约素,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了业汰?” 一聲冷哼從身側(cè)響起菩颖,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎放祟,沒(méi)想到半個(gè)月后呻右,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跪妥,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡眉撵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年落塑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憾赁。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖龙考,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炎功,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布亡问,位于F島的核電站,受9級(jí)特大地震影響州藕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜床玻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一锈死、第九天 我趴在偏房一處隱蔽的房頂上張望贫堰。 院中可真熱鬧待牵,春花似錦、人聲如沸缨该。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)膨更。三九已至妙真,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荚守,已是汗流浹背珍德。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留矗漾,地道東北人菱阵。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像缩功,于是被迫代替她去往敵國(guó)和親晴及。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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

  • 模塊和包 一 模塊 1 什么是模塊? 常見的場(chǎng)景:一個(gè)模塊就是一個(gè)包含了python定義和聲明的文件势木,文件名就是...
    go以恒閱讀 2,272評(píng)論 0 4
  • 一、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,746評(píng)論 0 10
  • 一啦桌、模塊 1溯壶、模塊和導(dǎo)入 當(dāng)程序代碼量變得相當(dāng)大及皂、邏輯結(jié)構(gòu)變得非常復(fù)雜的時(shí)候,我們最好把代碼按照邏輯和功能劃分成一...
    常大鵬閱讀 2,988評(píng)論 0 9
  • IO密集型程序且改、深拷貝和淺拷貝验烧、模塊導(dǎo)入、with 語(yǔ)句 1.1 GIL 學(xué)習(xí)目標(biāo) 1. 能夠說(shuō)出 GIL 是什...
    Cestine閱讀 794評(píng)論 0 0
  • 這部電影 講的是 復(fù)仇者聯(lián)盟 的分裂又跛。 第一次分裂碍拆,是是否要服從監(jiān)管體系。 兩位大頭大哥迅速冒頭慨蓝,以鋼鐵俠為代表的...
    朱明寬閱讀 338評(píng)論 0 0