天天看點

python學習------------異常以及反射

    學完這一節,python基礎部分就要告一段落了,期待進入新一階段的學習,也給自己說堅持就是勝利。

一、isinstance(obj,cls)

檢查obj是否是cls的對象

1、首先從學過的變量開始

其實也就是說:變量a,b是對象,是否是屬于int,str的類,屬于傳回True,不屬于傳回False

2、類中的對象和類之間的關系

3、對象和基類的關系

總結:

isinstance是判斷一個對象是否屬于類

就是對象和類的關系

對象和基類的關系

二、issubclass(sub,super)

檢查sub是否是super的派生類

三、異常處理

1、産生的緣由

    為了在程式設計過程中,增加和使用者互動的友好性,在程式出現錯誤時不将錯誤資訊顯示給使用者,也就是不會出現我們通常浏覽頁面時出現的大黃頁,而是顯示一個錯誤提示的界面。

2、在python中處理異常的方法 

在try中是正确的邏輯代碼

在except中是代碼邏輯塊出現錯誤

例如:

在一塊代碼中,加入我輸入數字,程式不會報錯,而當我輸入字母時,程式就會報錯。

而在加了try和except塊的代碼時,當輸入數字時,程式依然不會報錯,而輸入非數字時就會列印提示資訊,讓你輸入數字。

通過以上對比,可以看出加了異常處理的代碼比沒加異常處理的代碼的使用者互動的友好性提高了很多。

3、異常的種類

1)、指定的異常

上述代碼異常都是指定的是特定的錯誤處理,例如key,index,value等,但是這樣處理也會存在一定的問題,例如:

針對這樣的問題,一般我們處理異常時一般寫成如下的異常處理順序

也就是說先寫特殊的,最後寫最終的Exception,Exception也被叫做萬能異常,可以捕獲任意異常。

但是反過來會說,既然有了萬能異常可以捕獲任意的異常,還需要特殊異常做什麼?

答案是這樣的:對于特殊處理或提醒的異常需要先定義,最後定義Exception來確定程式運作正常。

總結一下特殊的異常

ArithmeticError

AssertionError

AttributeError

BaseException

BufferError

BytesWarning

DeprecationWarning

EnvironmentError

EOFError

Exception

FloatingPointError

FutureWarning

GeneratorExit

ImportError

ImportWarning

IndentationError

IndexError

IOError

KeyboardInterrupt

KeyError

LookupError

MemoryError

NameError

NotImplementedError

OSError

OverflowError

PendingDeprecationWarning

ReferenceError

RuntimeError

RuntimeWarning

StandardError

StopIteration

SyntaxError

SyntaxWarning

SystemError

SystemExit

TabError

TypeError

UnboundLocalError

UnicodeDecodeError

UnicodeEncodeError

UnicodeError

UnicodeTranslateError

UnicodeWarning

UserWarning

ValueError

Warning

ZeroDivisionError

4、異常的大結構

5、主動觸發異常

如果傳回的值為假,則就會主動觸發錯誤,即raise Exception("出現錯誤")

小結:

1、以上關于異常的進行中,都會有一個e:它的作用是什麼?

答案:e是對象,将IndexError等都封裝到e中,相當于類中的字段封裝的對象中。

2、Exception和這些特殊的處理IndexError是什麼關系?

答案:Exception是他們的基類。

3、為什麼下面的異常會列印這樣的提示?

try:

   int("aa")

except Exception,e:

   print e

#異常結果為:invalid literal for int() with base 10: 'aa'

首先給出答案:它是由類中的__str__方法産生的

這樣可以看出我們在異常中print e的結果是一個字元串,而在類中print 對象是記憶體位址,那怎麼做才能和print e一緻呢?

在類中加入__str__方法,再次print 對象,就會列印一個字元串,這就和在異常中列印invalid literal for int() with base 10: 'aa'原理一樣了。

本質為:在異常中e是對象,而Exception是類,也就是對象e調用類Exception中的__str__方法得到的結果。

6、自定義異常

7、斷言:assert

作用在程式調試時,判斷程式是否正确,用于debug

assert 條件

如果條件為真,不會報錯,否則,程式報錯

assert 1==1

assert 1==2

四、反射

1、python中的反射功能是由四種内置函數來提供的,hasattr,setattr,getattr,delattr這四個内置函數分别用于對對象内部執行:檢查是否含有某成員,設定某成員,擷取某成員,删除成員

2、下面通過例子一步步的讨論反射:

1)、我們模拟web為例

home.py

這就是說我們輸入對應的url,再進行判斷找到符合條件的url,傳回值

下面我們采用反射來進行操作

這樣一來在上面的代碼中就不需要再進行判斷,隻需去在home子產品中尋找符合的url,這對于大量的url來說,用反射就簡單了。

2)對四種内置函數産生的結果進行比較

3)在web上進行測試(練習反射)

3、反射操作類和對象中的成員

為什麼對象中隻有name,而用hasattr(obj,'show')卻顯示為True,因為對象中存在類對象指針,對象首先在自己的記憶體中找,如果沒有找到再到類中找,是以就會顯示找到,傳回結果為True

4、上面的操作都是在自己子產品的内部執行,接下來看在其他子產品執行效果

一句話總結反射:在容器中找對象的元素

5、動态導入子產品

五、單例模式

單例就是單個執行個體

單例模式存在的目的就是保證記憶體中隻存在一個執行個體,避免記憶體浪費

用兩個例子對比說明單例模式

1、不使用單例模式

這樣建立執行個體SqlHelper(1),但生成的id不同,占用大量記憶體。

2、采用單執行個體模式

1、建立靜态字段__static_instance = None 儲存永遠存在記憶體的執行個體

2、調用類方法@classmethod,傳回那個對象

3、通過類對象擷取永遠存在記憶體的執行個體

這就是建立單例模式的要點。。。。。

參考來源:

http://www.cnblogs.com/wupeiqi/

以及老男孩python開發視訊