欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

python面向?qū)ο缶幊痰姆瓷湓趺词褂?/h1>

這篇文章主要介紹“python面向?qū)ο缶幊痰姆瓷湓趺词褂谩保谌粘2僮髦校嘈藕芏嗳嗽趐ython面向?qū)ο缶幊痰姆瓷湓趺词褂脝栴}上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”python面向?qū)ο缶幊痰姆瓷湓趺词褂谩钡囊苫笥兴鶐椭〗酉聛恚埜【幰黄饋韺W(xué)習(xí)吧!

創(chuàng)新互聯(lián)公司自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元鎮(zhèn)沅做網(wǎng)站,已為上家服務(wù),為鎮(zhèn)沅各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

關(guān)于命名空間

昨天講反射的內(nèi)容主要是getattr、hasattr、setattr、delattr、callable這五個(gè)函數(shù)。其中有一個(gè)關(guān)鍵詞——命名空間,這是個(gè)非常非常重要的概念,深入學(xué)python一定要對命名空間有非常清楚的理解和認(rèn)識。

命名空間是python程序在運(yùn)行時(shí)向操作系統(tǒng)申請的一塊有名字的內(nèi)存空間。我們把內(nèi)存想象成一幢大樓,那么python解釋器執(zhí)行腳本(當(dāng)前執(zhí)行的py文件)時(shí)會申請一層樓存放當(dāng)前執(zhí)行的py文件中的數(shù)據(jù)和代碼塊,這塊命名空間的名字叫__main__;若在這個(gè)文件中定義了類,那么會在樓層里給這個(gè)類單獨(dú)開辟一個(gè)房間用來存放這個(gè)類內(nèi)部的數(shù)據(jù)和代碼塊,房間的名字就是類名;創(chuàng)建類的實(shí)例時(shí)也會給實(shí)例單獨(dú)開辟一個(gè)房間,里面存放了實(shí)例的屬性和類指針,訪問實(shí)例的屬性時(shí)在實(shí)例的命名空間中找,訪問實(shí)例的綁定方法時(shí)通過類指針到類的房間里找,房間的名字就是實(shí)例的名字。假設(shè)我們導(dǎo)入了其他的模塊,那么python解釋器會向系統(tǒng)新申請一層樓來存放被導(dǎo)入的py文件,同理可以推導(dǎo)出新導(dǎo)入的py文件中也可能定義了類和創(chuàng)建了類的實(shí)例。那些類和它的實(shí)例都會存放在新的樓層,這個(gè)新的樓層名字就是py文件名。

以下通過案例和圖例進(jìn)行詳細(xì)講解:

有一個(gè)animal_file.py文件,內(nèi)容如下:

class Animal:kind = '動(dòng)物'def __init__(self, name):self.name = namedef eat(self):print(f'{self.name}正在進(jìn)食!')

另有一個(gè)run.py文件,內(nèi)容如下:

import animal_fileclass Cat(animal_file.Animal):def __init__(self, name, count=0):self.count = count
        animal_file.Animal.__init__(self, name)def mousing(self):print(f'貓咪“{self.name}”捉住了{(lán)self.count}只老鼠')white_cat = Cat('大白貓')white_cat.mousing()out:貓咪“大白貓”捉住了0只老鼠

實(shí)例圖如下:

python面向?qū)ο缶幊痰姆瓷湓趺词褂?></p><p>執(zhí)行run.py文件時(shí)會先申請一塊名字叫__main__的命名空間;執(zhí)行import animal_file語句時(shí)會新申請一塊名字叫animal_file的命名空間,導(dǎo)入文件內(nèi)容時(shí)會在animal_file的命名空間內(nèi)開辟一塊名字叫Animal類的名稱空間,內(nèi)部有kind變量和__init__方法以及eat方法,導(dǎo)入完畢后返回run.py文件繼續(xù)執(zhí)行;執(zhí)行class Cat(animal_file.Animal):語句時(shí)會__main__的命名空間內(nèi)開辟一塊名字叫Cat的名稱空間,內(nèi)部有指向Animal類的父類指針、__init__方法和mousing方法;創(chuàng)建white_cat實(shí)例時(shí)會__main__的命名空間內(nèi)開辟一塊名字叫white_cat的名稱空間,內(nèi)部有指向本類的指針、name屬性和count屬性。</p><p>以上就是關(guān)于命名空間的內(nèi)容和代碼實(shí)例、圖例詳細(xì)講解,對命名空間概念還不清楚的朋友一定不要嫌啰嗦,耐心看完并理解,最好自己嘗試畫圖,一定要把命名空間概念搞得清清楚楚。</p><h3>反射的實(shí)例1——登錄驗(yàn)證</h3><p>代碼如下:</p><pre>class Authentic:lst = [('登錄', 'login'), ('注冊', 'register'), ('列表', 'table')]def __init__(self, name, pwd):self.name = name
        self.pwd = pwd
        self.table = '測試列表'def register(self):name = input('請輸入用戶名:')pwd1 = input('請輸入密碼:')pwd2 = input('請?jiān)佥斎胍淮?')if pwd1 == pwd2 and len(pwd1) > 5:self.name = name
            self.pwd = pwd1print(f'注冊賬號"{name}"成功')else:print('兩次密碼不一致或密碼長度小于6,注冊失敗')def login(self):name = input('請輸入用戶名:')pwd = input('請輸入密碼:')if pwd == self.pwd and name == self.name:print(f'登錄賬號"{name}"成功')else:print('用戶名或密碼不對,登錄失敗!')user = Authentic('abc', '123456')while 1:for j, i in enumerate(Authentic.lst):print(f'{j+1}.{i[0]}', '\t', end='')print()ret = input('請輸入你的選擇:')if ret.upper() == 'Q':breakelse:try:choice = Authentic.lst[int(ret)-1][1]if hasattr(user, choice):if callable(ret := getattr(user, choice)):ret()else:print(ret)except (IndexError, ValueError):pass</pre><p>以上是一個(gè)登錄驗(yàn)證功能的極簡示例,在Authentic類中定義了login、register兩個(gè)方法,對應(yīng)的菜單選項(xiàng)有3條;接下來初始化實(shí)例user,然后進(jìn)入循環(huán),循環(huán)體內(nèi)開始先打印選項(xiàng)列表,再接受用戶輸入;判斷輸入內(nèi)容是’q’或’Q’則退出循環(huán);否則則嘗試對輸入內(nèi)容轉(zhuǎn)成數(shù)字并用它對列表取值(嘗試的時(shí)候發(fā)生索引越界或不是數(shù)字類型的錯(cuò)誤均忽略),取值成功后choice的內(nèi)容是字符串’login’或’register’或’table’之中的一種,然后對choice值判斷,可執(zhí)行的則執(zhí)行它,不可執(zhí)行的則打印它。</p><p>以上是使用反射的一個(gè)簡單案例。粗看平平無奇,請對比一下不使用反射實(shí)現(xiàn)同樣功能的代碼:</p><pre>user = Authentic('abc', '123456')while 1:for j, i in enumerate(Authentic.lst):print(f'{j+1}.{i[0]}', '\t', end='')print()ret = input('請輸入你的選擇:')if ret.upper() == 'Q':breakelif ret == '1':user.login()elif ret == '2':user.register()elif ret == '3':print(user.table)</pre><p>請仔細(xì)思考一下,目前選項(xiàng)列表是3項(xiàng),使用了3次elif,如果選項(xiàng)多達(dá)幾十項(xiàng),那么代碼是不是要隨著選項(xiàng)列表的增加而新增幾十項(xiàng)elif?回頭再看使用反射實(shí)現(xiàn)的代碼,無論選項(xiàng)列表是3項(xiàng)、30項(xiàng)、甚至300項(xiàng)都不需要增加elif判斷。</p><h3>反射的實(shí)例2——文件操作</h3><p>3行代碼實(shí)現(xiàn)文件操作的腳本,現(xiàn)在嘗試新建一個(gè)py文件,內(nèi)容如下,文件名叫f.py</p><pre>import shutilfrom sys import argvgetattr(shutil, argv[1].lower())(argv[2], argv[3])</pre><p>再打開cmd窗口,進(jìn)入f.py文件所在的目錄。</p><p>執(zhí)行下面的命令:</p><pre>python f.py copy f.py fpy.bak
python f.py move fpy.bak f1.py
python f.py rename f1.py f2.py</pre><p>每次執(zhí)行完可以檢查一下命令是否正常執(zhí)行。</p><h3>如何獲取當(dāng)前腳本的名字內(nèi)容</h3><p>關(guān)于反射,大家都知道了用getattr可獲得指定命名空間中指定名字的內(nèi)容,但是如何獲取當(dāng)前腳本的名字內(nèi)容呢?首先import sys,然后使用sys.modules[’__main__’]可獲得當(dāng)前腳本的命名空間。</p><p>假設(shè)有一個(gè)小需求,a變量值為123,b變量值為’abc’,判斷用戶輸入a,則打印123,判斷輸入是b則打印’abc’。</p><pre>import sys

a = 123b = 'abc'ret = input('請輸入要打印的名字:')if hasattr(sys.modules['__main__'], ret):print(getattr(sys.modules['__main__'], ret))</pre><p>想象一下如果變量名字有幾十個(gè),用通常的if elif else的寫法是不是需要寫幾十行?用反射簡單的2行代碼即搞定一大堆if eilf else。</p><p>到此,關(guān)于“python面向?qū)ο缶幊痰姆瓷湓趺词褂谩钡膶W(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!</p>            <p>
                當(dāng)前名稱:<a href=python面向?qū)ο缶幊痰姆瓷湓趺词褂?/a>
標(biāo)題來源:http://chinadenli.net/article8/gogoip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司網(wǎng)站排名搜索引擎優(yōu)化App設(shè)計(jì)網(wǎng)站建設(shè)網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營