最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

6th Python面向?qū)ο筮M(jìn)階

2021-12-29 13:13 作者:MoNanGo  | 我要投稿

(這部分可能會(huì)感覺突然難度上來了,大家慢慢琢磨,懂了就簡(jiǎn)單了,摸索的過程就是提升)

我們知道類中的方法第一個(gè)參數(shù)默認(rèn)是self,那我們就可以理解這個(gè)方法和對(duì)象綁定在一塊,只能調(diào)用對(duì)象的東西。

6.1 類方法 classmethod

類方法通過@classmethod裝飾器實(shí)現(xiàn),類方法和普通方法區(qū)別是,類方法只能訪問類變量,不能訪問實(shí)例變量??梢哉f@classmethod就是讓這個(gè)方法和類綁定在一塊,只能調(diào)用類里面的東西。

code

上面的代碼就會(huì)報(bào)錯(cuò)AttributeError: type object 'Dog' has no attribute 'name',找不到self.name,也就是訪問不了__init__()實(shí)例化傳進(jìn)的參數(shù)。

我們打印一下類方法傳入的self

code

輸出的是

?<class '__main__.Dog'> ?# 類本身
?<__main__.Dog object at 0x0DA79D00> ?# 實(shí)例對(duì)象 后面的這個(gè)16進(jìn)制的地址會(huì)各有不同
?<class '__main__.Dog'> ?# 類本身

可以看出,類方法的self返回的是類本身,而不是像普通方法那樣,self返回的是實(shí)例對(duì)象。

這個(gè)類方法應(yīng)用場(chǎng)景不多,但我們也需要知道一下,下面就設(shè)計(jì)了一個(gè)場(chǎng)景:

現(xiàn)在要實(shí)現(xiàn) 每生成一個(gè)學(xué)生,num就要+1的一個(gè)需求。

code

我們發(fā)現(xiàn)類變量根本就沒有變,還是0,這是為什么呢?因?yàn)?span id="s0sssss00s" class="color-gray-02">self.stu_num+=1是對(duì)實(shí)例的變量進(jìn)行賦值,而不是類本身的變量,這個(gè)是需要注意的一個(gè)點(diǎn),很多初學(xué)者可能會(huì)犯這樣的錯(cuò)誤。

code

這樣還是有一點(diǎn)問題的,因?yàn)槟悻F(xiàn)在在外面直接Student.stu_num就可以修改了,這樣安全性就很垃圾了。。。所以我們可以用類方法來實(shí)現(xiàn)封裝。

code

哎,等等,你試試在外面調(diào)用add_stu()這個(gè)類方法,不是還能在外面改么?對(duì),確實(shí)還能改,但是和直接修改類變量不同的是,我現(xiàn)在可以判斷是否真的生成了實(shí)例(或是其他條件來約束)。

code

這樣就會(huì)實(shí)現(xiàn)簡(jiǎn)單的防止直接修改,你必須傳入帶有name屬性的實(shí)例對(duì)象進(jìn)來才可以在外面修改類變量。有人說這樣的話,我隨便創(chuàng)建一個(gè)帶name的實(shí)例不就好了?

但你要想想,我們這個(gè)只是簡(jiǎn)單的防止外部修改,如果真正的開發(fā)過程中,我的if判斷再改的復(fù)雜一些,那就不好創(chuàng)建實(shí)例對(duì)象從外部改了。

6.2 靜態(tài)方法 staticmethod

和類方法類似,是用@staticmethod裝飾器來實(shí)現(xiàn)的,不能訪問類變量、也不能訪問實(shí)例變量,這里的兩種變量包括變量和方法??梢哉f,類和實(shí)例的所有東西靜態(tài)方法都訪問不了,既不綁定類又不綁定對(duì)象,和類外面的方法一樣和類與對(duì)象沒什么關(guān)系。

我們知道,類里面的普通方法調(diào)用會(huì)默認(rèn)傳實(shí)例對(duì)象:s.fly() -> s.fly(s),而靜態(tài)方法就是去掉了這個(gè)步驟,所以fly(self)方法的self沒有任何東西傳給他,除非你這樣調(diào)用s.fly(s),也就是自己手動(dòng)傳進(jìn)self

可以說,靜態(tài)方法就是被類孤立出來的方法,他從類里面什么都得不到,和類外面的方法沒區(qū)別。

使用場(chǎng)景的話,基本沒有,可能在某些特殊場(chǎng)景中會(huì)用,我們知道即可。

6.3 屬性方法 property

把一個(gè)方法變成一個(gè)靜態(tài)的屬性(變量),也是用裝飾器@property來實(shí)現(xiàn)的。

code

我們可以看到,如果fly()就報(bào)錯(cuò),fly才是真的調(diào)用fly()方法。這樣我們就實(shí)現(xiàn)了調(diào)用方法名就可以調(diào)用方法。

比如我們?cè)谌ツ膬汗倬W(wǎng)查詢機(jī)票,他們查機(jī)票的步驟有三步:

  1. 連接各機(jī)場(chǎng)的航班系統(tǒng);

  2. 查詢信息;

  3. 對(duì)返回的信息進(jìn)行處理,解析,顯示給用戶。

用戶當(dāng)然只看飛機(jī)的狀態(tài)和價(jià)格,這些都是一些靜態(tài)的信息,但是分析的過程都是根據(jù)各機(jī)場(chǎng)航班系統(tǒng)動(dòng)態(tài)數(shù)據(jù)解析的,那我們模擬寫一段代碼展現(xiàn)這一過程:

code

用戶看到的就是flight_status這一靜態(tài)變量,但是每次調(diào)用這一變量時(shí),程序都動(dòng)態(tài)進(jìn)行了上面三步。

問題又來了,既然他是個(gè)變量,那我們可以給它賦值么?實(shí)際是不行的,如果賦值,Python解釋器會(huì)報(bào)錯(cuò)的。那真的想改怎么辦?那我們就要再加一個(gè)屬性方法,格式如下:

code

那我現(xiàn)在想刪了這個(gè)屬性方法,還是一樣的方法,增加一個(gè)方法:

code

6.4 反射

這個(gè)很重要。主要指程序可以訪問、檢測(cè)和修改本身狀態(tài)或行為的一種能力(自?。?jiǎn)單來說,就是可以通過字符串的形式來操作(增刪改查)對(duì)象的屬性。

code

代碼中的hasattr()就是反射的四個(gè)方法之一,是檢測(cè)屬性是否存在的。還有其他三種方法,分別是:getattr()、setattr()delattr(),分別對(duì)應(yīng)了獲取、設(shè)置(賦值)、刪除。接下來,我們就來試試這些方法:

code

通過上面的代碼可以看出,我們可以操作的東西包括屬性和方法。

那我們上面講的是實(shí)現(xiàn)在程序自身尋找屬性,那在大型程序中,代碼是分很多文件存放的,現(xiàn)在我們需要在一個(gè)py文件中尋找屬性,怎么辦?getattr(filename, 屬性)肯定是不行的。說到這里,我們不得不提一個(gè)知識(shí)點(diǎn)。

我們輸出__name__,我們可以看到返回的是__main____main__可以代表模塊本身(就是該py文件),可以類似理解為self可以代表對(duì)象;但它又不完全是self,因?yàn)?code>self可以通過.來調(diào)用對(duì)象中的屬性和方法,而__mian__不可以。

那我們?cè)偻抡f,我們直接看下面兩段代碼:

code

我們可以得出,code1code2輸出都是一樣的,那區(qū)別是什么呢?

其實(shí),code1會(huì)在別的模塊(別的py文件)調(diào)用自身模塊(自身所在的py文件)時(shí)發(fā)揮作用。如果自己執(zhí)行代碼,那if外面和if里面的全部執(zhí)行;如果外部導(dǎo)入執(zhí)行,就只執(zhí)行if外部的代碼,內(nèi)部的不執(zhí)行。

code

我們運(yùn)行test2.py,可以看到,輸出的是test,所以我們得出,__name__在當(dāng)前模塊主動(dòng)執(zhí)行的情況下(即不是被導(dǎo)入的情況下),等于__main__;在被其他模塊導(dǎo)入執(zhí)行的情況下,就是模塊名了。

sys模塊中的modules屬性(數(shù)據(jù)類型為字典)中,就有鍵為__main__的鍵值對(duì),我們上面說了__mian__的作用不能完全等同于self的功能是因?yàn)椴荒芡ㄟ^.運(yùn)算來調(diào)用,那這里鍵為__main__的鍵值對(duì)所對(duì)應(yīng)的值就能完全等同于self的功能。

code

像這些東西現(xiàn)在我們寫程序不怎么用,但是學(xué)到后面像Django那些框架,里面就是不斷用反射,實(shí)現(xiàn)不同模塊的調(diào)用。

動(dòng)態(tài)加載模塊

我們知道,程序運(yùn)行時(shí),類就會(huì)自動(dòng)的全部加載。那我們就基于反射機(jī)制,來實(shí)現(xiàn)動(dòng)態(tài)加載模塊的功能,讓用戶輸入什么模塊,我們?cè)偌虞d該模塊,而不是剛運(yùn)行程序就全部加載了。

code

這里需要注意的是,挎包導(dǎo)入模塊時(shí),要確保當(dāng)前工作路徑下有你要導(dǎo)入的包。比如

反射應(yīng)用場(chǎng)景的再舉例

比如我們有個(gè)網(wǎng)站,用戶點(diǎn)進(jìn)去那個(gè)網(wǎng)站就加載那個(gè)網(wǎng)站,我們沒學(xué)反射之前寫出來的代碼可能是這樣的:

code

這樣很不方便,如果有100個(gè)界面,那我們就要寫100個(gè)if分支。

那我們學(xué)過反射之后,就可以進(jìn)行修改:

code

這樣用戶輸入什么就加載相應(yīng)的模塊,當(dāng)模塊增多時(shí),就不用修改代碼,增加分支判斷了。

6.6 類的雙下劃線方法

需要大概了解的方法

len方法

code

len方法必須返回值為整數(shù),我們前面通過len()來看列表或字典等數(shù)據(jù)的長(zhǎng)度就是重寫定義列表和字典等數(shù)據(jù)類的__len__()方法來實(shí)現(xiàn)的。

除非我們以后需要實(shí)現(xiàn)一個(gè)類,這個(gè)類要靠自己實(shí)現(xiàn)len方法的話,我們才會(huì)用到,這種情況遇到的不多,所以我們知道就可以了。

hash方法

hash方法是每個(gè)類都會(huì)自帶的,功能就是我們前面說到的hash的基本功能。

code

當(dāng)然,我們也可以重寫,hash方法規(guī)定返回值也必須是integer類型的數(shù)據(jù)。

code

eq方法

==就會(huì)觸發(fā)eq方法,eq必須帶一個(gè)參數(shù)other,就是==右側(cè)的傳入對(duì)象。

code

通過eq方法,我們就可以自定義等于的評(píng)判標(biāo)準(zhǔn)。

item系列

這里不得不說一下每個(gè)對(duì)象自帶的__dict__屬性,它里面存放了對(duì)象的所有屬性,以鍵值對(duì)(key: 屬性名, value: 屬性值)存儲(chǔ)在__dict__這個(gè)字典中。

code

可以把一個(gè)對(duì)象變成dict,可以像dict一樣,增刪改查。

code

可以從代碼中看出,都是對(duì)__dict__屬性的操作,其中需要注意的就是__setitem__(self, key, value)__delitem__(self, key)__delattr__(self, item)的區(qū)別。

__setitem__(self, key, value)如果key不存在,那么它的功能就相當(dāng)于新建(增);若key存在,那么它的功能就是修改了(改)。

__delitem__(self, key)__delattr__(self, item)的區(qū)別:前者是通過del p['website']觸發(fā),后者是del p.website觸發(fā),只有這個(gè)區(qū)別,其他都是一樣的。

另外還有一個(gè)__getitem__(),與之相似的__getattr__()是在獲取一個(gè)沒有的屬性時(shí)候觸發(fā),可以用來提示失敗操作的。

重點(diǎn)需要會(huì)的方法

上面除了item系列的方法之外基本不怎么用,item也就是偶爾用用。接下來說的一些雙下線的方法就是我們需要重點(diǎn)掌握的方法了。

str方法 & repr方法

這兩個(gè)方法功能比較像,均可以改變對(duì)象的字符串顯示格式。

我們可以先看看如果我們不重寫這兩個(gè)下線方法,我們輸出的是什么:

code

那我們重寫這兩個(gè)方法,再來看看輸出:

code

那肯定會(huì)問了,這兩個(gè)方法有什么區(qū)別?

str函數(shù)或者print函數(shù)調(diào)用時(shí)觸發(fā)obj.__str__();

repr函數(shù)或者交互式解釋器(比如Windows的cmd)中調(diào)用時(shí)觸發(fā)obj.__repr__()

如果觸發(fā)__str__()的時(shí)候,__str__()沒有被定義,那么就會(huì)觸發(fā)__repr__()來代替輸出;

注意:這倆方法的返回值必須是字符串,否則拋出異常。

PS:str比repr常用

del 析構(gòu)方法

析構(gòu)方法就是,當(dāng)對(duì)象在內(nèi)存中被釋放時(shí),自動(dòng)觸發(fā)執(zhí)行。

code

但是這里我們要清楚一點(diǎn),釋放內(nèi)存資源是Python解釋器的事,我們程序員不能修改,所以__del__()里面不用實(shí)現(xiàn)怎么釋放內(nèi)存或者阻止釋放資源,你只能寫一些釋放資源時(shí)做一些其他事情,比如print('該資源已釋放'),告訴我們已經(jīng)釋放。

當(dāng)然,如果我們什么都不寫,還是會(huì)被釋放掉。

code

我們會(huì)看到,程序結(jié)束執(zhí)行之后,會(huì)有一個(gè)對(duì)象被釋放了的輸出,這個(gè)是因?yàn)槌绦蜻\(yùn)行結(jié)束的時(shí)候,Python解釋器會(huì)將該程序中所有資源都會(huì)被釋放,所以會(huì)有這個(gè)輸出。

new方法

我們知道實(shí)例化對(duì)象的時(shí)候,init會(huì)自動(dòng)執(zhí)行。但是實(shí)際上在init方法之前,還會(huì)執(zhí)行一個(gè)new方法(也是自動(dòng)執(zhí)行的),你可以在new里執(zhí)行一些實(shí)例化前的定制動(dòng)作。(new方法可以進(jìn)行一些實(shí)例初始化前的工作)

code

運(yùn)行這段代碼,我們會(huì)發(fā)現(xiàn),init方法不執(zhí)行了。。只執(zhí)行了重寫的new方法。

這樣的原因是,new方法不光在init之前執(zhí)行,還負(fù)責(zé)執(zhí)行init,所以我們重寫的new方法必須返回一個(gè)父類new方法,使init方法開始執(zhí)行。

code

new實(shí)現(xiàn)單例模式

new方法最多的應(yīng)用就是單例模式了,那我們先來說說什么是單例模式。

程序員開發(fā)網(wǎng)站會(huì)有一個(gè)設(shè)計(jì)模式,開發(fā)app也會(huì)有一個(gè)設(shè)計(jì)模式,那所有的設(shè)計(jì)模式共有23種,那單例模式也是其中之一。

單例模式就是確保這個(gè)類只能實(shí)例化一次。通過單例模式可以保證系統(tǒng)中一個(gè)類只有一個(gè)實(shí)例而且該實(shí)例易于外界訪問,從而方便對(duì)實(shí)例個(gè)數(shù)的控制并節(jié)約系統(tǒng)資源。如果希望在系統(tǒng)中某個(gè)類的對(duì)象只能存在一個(gè),單例模式是最好的解決方案。

應(yīng)用的場(chǎng)景也有很多,比如你打開電腦的設(shè)置窗口,無論你點(diǎn)擊多少次,他就只會(huì)打開一個(gè)窗口。

我們模擬一下打印機(jī)的過程:

code

可以看到,我們創(chuàng)建了三個(gè)對(duì)象(內(nèi)存地址各不相同),這樣雖然實(shí)現(xiàn)了效果,但是很浪費(fèi)資源,我們現(xiàn)在來把它修改成單例模式。

code

這里我們輸出三個(gè)對(duì)象的內(nèi)存地址,可以發(fā)現(xiàn),他們的內(nèi)存地址都是一樣的,說明我們已經(jīng)實(shí)現(xiàn)了單例模式??梢哉f,表面上看起來實(shí)例化了p1,p2,p3三個(gè)對(duì)象

值得一提的是,我們可以輸出一下p1p2name屬性,會(huì)發(fā)現(xiàn)他們的name都變成了excel exe,原因就是init在每次創(chuàng)建實(shí)例的時(shí)候都執(zhí)行了,所以實(shí)例化的單例對(duì)象的name屬性就只保留最新的name值了,所以才是excel exe。

call方法

我們要講的最后一個(gè)雙下線方法了,call方法會(huì)在對(duì)象后面加()時(shí)觸發(fā)。這里得要注意一下,構(gòu)造方法new的執(zhí)行是由創(chuàng)建對(duì)象觸發(fā)的,即:對(duì)象 = 類名();而對(duì)于call方法的執(zhí)行是由對(duì)象后加括號(hào)觸發(fā)的,即:對(duì)象() or 類()()。不能混淆了。

code

call方法一般很少用,python有個(gè)web框架用到過,所以就提一下。

python的雙下線方法還有很多,我們不一定都要去搞明白,有的都是Python解釋器用的,知道這些基本就夠用了。

6.7 type 動(dòng)態(tài)創(chuàng)建類

我們先來看看下面這段代碼:

code

運(yùn)行之后我們發(fā)現(xiàn),type(p)顯示類型為Person,這個(gè)我們理解,因?yàn)?code>p是從Person中實(shí)例化出來的對(duì)象;但是type(Person)顯示的類型為type,按照我們剛才理解type(p)的思路來理解,type應(yīng)該就是Person的父類,我們創(chuàng)建的所有類都是從type中繼承出來的。

type()不光可以查詢類型,還可以動(dòng)態(tài)創(chuàng)建一個(gè)類:

code

那么這個(gè)只是簡(jiǎn)單的類,復(fù)雜的類我們也可以通過type()動(dòng)態(tài)創(chuàng)建:

code

動(dòng)態(tài)創(chuàng)建類很有用,在Django中也經(jīng)常使用。要加什么參數(shù)可以自由的支配,不用像前面靜態(tài)創(chuàng)建類那樣用一些方法去實(shí)現(xiàn)對(duì)類的操作。

6.8 類的判別

這里我們主要說兩個(gè)方法:

isinstance()

這個(gè)方法我們前面也說過,但是前面只是說了用來判斷數(shù)據(jù)類型,比如:

code

這里我們還可以用這個(gè)方法來判斷obj是否是一個(gè)類的對(duì)象:

code

需要注意的是,如果A類創(chuàng)建的對(duì)象與A類的父類在一塊isinstance(),返回的也是True。

code

issubclass()

上面的方法是檢測(cè)對(duì)象和類的,這里這個(gè)方法呢,就是來檢測(cè)類與類之間的父類關(guān)系的,對(duì)于issubclass(sub, super),如果subsuper類的子類,就會(huì)返回True;反之則返回False。

code

通過上面的例子可以看出,參數(shù)的順序不能反,子類要在前,父類要在后。

當(dāng)然,這兩個(gè)方法不怎么重要,知道就好,關(guān)鍵是下面要說的異常處理。

6.9 異常處理

常規(guī)異常處理

我們前面寫各種代碼的時(shí)候,不免會(huì)報(bào)錯(cuò),但是這些錯(cuò)誤是給程序員看的,如果給用戶看的話,用戶會(huì)看不懂的。所以就需要我們將代碼中可能發(fā)生的錯(cuò)誤捕捉(監(jiān)測(cè)),格式如下:

code

像我們斷網(wǎng)時(shí)打開網(wǎng)頁,輸入網(wǎng)址進(jìn)入后,網(wǎng)頁會(huì)顯示找不到服務(wù)器,并且提示你可以怎么做來恢復(fù)正常。這就是我們異常處理需要實(shí)現(xiàn)的目的。

比如我們寫一個(gè)兩個(gè)數(shù)相加的程序,然后讓程序可以在報(bào)錯(cuò)時(shí)不報(bào)錯(cuò),而是輸出我們寫的異常信息。

code

那我們對(duì)用戶友好一點(diǎn)就可以改成下面這樣的代碼:

code

這樣我們就可以讓程序出錯(cuò)了之后可以繼續(xù)運(yùn)行,并且告訴用戶出了什么錯(cuò),這樣就可以提高程序的容錯(cuò)性,還能讓用戶的程序體驗(yàn)提高。

異常類型

剛剛代碼中的Exception是萬能異常,無論出什么類型的錯(cuò)誤都會(huì)顯示一個(gè)異常處理的情況,所以萬能異常是我們不推薦的。

我們異常處理考慮的越細(xì)越全面就會(huì)使程序的使用性更高。

那我們就需要了解一些常見的異常類型:

  1. AttributeError:試圖訪問一個(gè)對(duì)象沒有的屬性,比如foo.x,但是對(duì)象foo中沒有屬性x;

  2. IOError:輸入/輸出異常;基本上是無法打開文件或者文件操作無權(quán)限等等;

  3. ImportError:無法引入模塊或包;基本上是路徑問題或名稱錯(cuò)誤;

  4. IndentationError:語法錯(cuò)誤(的子類) 或代碼沒有正確對(duì)齊(代碼是否對(duì)齊是捕捉不到的,因?yàn)镻ython解釋器初次編譯的時(shí)候就會(huì)報(bào)錯(cuò),不會(huì)進(jìn)入到捕捉異常的步驟);

  5. IndexError:下標(biāo)索引超出序列邊界,比如當(dāng)x只有三個(gè)元素,卻試圖訪問x[5];

  6. KeyError:試圖訪問字典里不存在的鍵;

  7. KeyboardInterruptCtrl+C被按下;

  8. NameError:使用一個(gè)還未被賦予對(duì)象的變量;

  9. SyntaxError:Python代碼非法,語法錯(cuò)誤(也捕捉不到,因?yàn)镻ython解釋器初次編譯的時(shí)候就會(huì)報(bào)錯(cuò),不會(huì)進(jìn)入到捕捉異常的步驟);

  10. TypeError:傳入對(duì)象類型與要求的不符合;

  11. UnboundLocalError:試圖訪問一個(gè)還未被設(shè)置的局部變量,基本上是由于另有一個(gè)同名的全局變量,導(dǎo)致你以為正在訪問它;

  12. ValueError:傳入一個(gè)調(diào)用者不期望的值,即使值的類型是正確的。

Python也提供一次捕獲多個(gè)異常:

code

我們將萬能異??梢苑旁诔绦虻淖詈?,這樣可以確保程序出錯(cuò)也不會(huì)停止運(yùn)行,然后我們慢慢找bug修改。(萬能異常捕獲不到自定義異常)

那么其實(shí)try的語法還有一個(gè)else語句和finally語句:

code

當(dāng)然,還有其他很多的異常類型,我們就不一一說了,我們只要知道怎樣捕捉異常就可以了。

主動(dòng)觸發(fā)異常

我們利用raise來主動(dòng)觸發(fā)異常:raise ValueError(什么類型的異常自己設(shè)定),一般和自定義異常一起用。

自定義異常

Python中的所有異常都是一個(gè)對(duì)象,他們都繼承一個(gè)父類——BaseException

code

6.10 assert斷言

assert語法用于判斷代碼是否符合執(zhí)行預(yù)期

code

一般用于接口測(cè)試,我們寫完一個(gè)大項(xiàng)目,需要一個(gè)一個(gè)檢測(cè)所有接口是否正常工作,這時(shí)候我們就寫一個(gè)腳本用assert檢測(cè)接口調(diào)用結(jié)果是否和預(yù)期結(jié)果數(shù)據(jù)相同。

assert在別人調(diào)用你的接口時(shí),還可以檢測(cè)傳遞的數(shù)據(jù)是否是指定的關(guān)鍵參數(shù),比如下面代碼所演示的:

code

6.11 自檢

Question

  1. 靜態(tài)方法、類方法、屬性方法的區(qū)別,通過代碼來體現(xiàn)。

  2. 如何通過反射往一個(gè)類里添加一個(gè)方法?

  3. 請(qǐng)通過代碼實(shí)現(xiàn)反射判斷當(dāng)前模塊里是否有一個(gè)Dog類?

  4. 寫一個(gè)小腳本,不斷接收用戶指令,根據(jù)指令動(dòng)態(tài)導(dǎo)入指定模塊。

  5. 自己手動(dòng)寫出一個(gè)單例模式,不要看文中給出的代碼,寫完再看。

  6. 寫一個(gè)可以像字典一樣操作的實(shí)例。

  7. 用type動(dòng)態(tài)創(chuàng)建一個(gè)Person類, 包含構(gòu)造函數(shù)、walk\talk方法。

  8. 自定義一個(gè)異常,并在代碼里手動(dòng)觸法&捕捉。

答案都在文中哈,自己寫完可以自行翻找。


6th Python面向?qū)ο筮M(jìn)階的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
徐闻县| 天镇县| 彭州市| 枣庄市| 博罗县| 揭阳市| 桃江县| 株洲县| 富宁县| 达州市| 孝感市| 宝应县| 高平市| 临夏市| 奇台县| 永州市| 秭归县| 盱眙县| 柳林县| 镇原县| 定州市| 巴南区| 杨浦区| 吴忠市| 石首市| 信阳市| 天津市| 信宜市| 资阳市| 翁牛特旗| 黔西县| 海伦市| 盐津县| 常山县| 昌都县| 岱山县| 册亨县| 陆良县| 阿拉善右旗| 临汾市| 吉安县|