python多繼承,剛開始我是表示驚訝的,畢竟學的php,哪來的多繼承?頂多也就是利用介面模擬多繼承後者使用反射機制實現。那麼還是來看看python的強大吧 1 首先,Python的類繼承了多個類,那麼其尋找方法的方式有兩種,分別是:深度優先(經典類)和廣度優先(新式類) 2 共有與私有成員(很多的 ...
python多繼承,剛開始我是表示驚訝的,畢竟學的php,哪來的多繼承?頂多也就是利用介面模擬多繼承後者使用反射機制實現。那麼還是來看看python的強大吧
1 首先,Python的類繼承了多個類,那麼其尋找方法的方式有兩種,分別是:深度優先(經典類)和廣度優先(新式類)
class 經典類{}
#唯一的區別就是要繼承object,其之類都是新式類 class 新式類(object)
#方法尋找
class D(object): def bar(self): print 'D.bar' class C(D): def bar(self): print 'C.bar' class B(D): def bar(self): print 'B.bar' class A(B, C): #按順序繼承,尋找也是按此順序進行 #調用父類構造器最好用supper() def bar(self): print 'A.bar' a = A() # 執行bar方法時 # 首先去A類中查找,如果A類中沒有,則繼續去B類中找,如果B類中麽有,則繼續去C類中找,如果C類中麽有,則繼續去D類中找,如果還是未找到,則報錯 # 所以,查找順序:A --> B --> C --> D # 在上述查找bar方法的過程中,一旦找到,則尋找過程立即中斷,便不會再繼續找了 a.bar()
# 如果是經典類:首先去A類中查找,如果A類中沒有,則繼續去B類中找,如果B類中麽有,則繼續去D類中找,如果D類中麽有,則繼續去C類中找,如果還是未找到,則報錯
# 所以,查找順序:A --> B --> D --> C
# 建議使用新式類
2 共有與私有成員(很多的特殊成員此處不列出)
class A: name = "公有靜態欄位" __private = "私有靜態欄位" def __init__(self): self.name = '公有欄位' self.__foo = "私有欄位" #加上 '__' 就是私有的,外部訪問會出錯
3 檢測對象
#檢查是否obj是否是類 cls 的對象 class Foo(object): pass obj = Foo() isinstance(obj, Foo) #檢查sub類是否是 super 類的派生類 class Foo(object): pass class Bar(Foo): pass issubclass(Bar, Foo)
4 異常處理
常用的異常
AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性x
IOError 輸入/輸出異常;基本上是無法打開文件
ImportError 無法引入模塊或包;基本上是路徑問題或名稱錯誤
IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊
IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]
KeyError 試圖訪問字典里不存在的鍵
KeyboardInterrupt Ctrl+C被按下
NameError 使用一個還未被賦予對象的變數
SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了)
TypeError 傳入對象類型與要求的不符合
UnboundLocalError 試圖訪問一個還未被設置的局部變數,基本上是由於另有一個同名的全局變數,導致你以為正在訪問它
ValueError 傳入一個調用者不期望的值,即使值的類型是正確的
#結構 try: # 主代碼塊 pass except KeyError,e: # 異常時,執行該塊 pass else: # 主代碼塊執行完,執行該塊 pass finally: # 無論異常與否,最終執行該塊 pass
5 主動觸發異常
raise
Exception(
'錯誤了。。。'
)
6 自定義異常處理
class WupeiqiException(Exception): def __init__(self, msg): self.message = msg def __str__(self): return self.message try: raise WupeiqiException('出錯') except WupeiqiException,e: print e
7 反射
# #### 檢查obj是否含有成員 #### hasattr(obj, 'name') hasattr(obj, 'func') # #### 獲取obj成員 #### getattr(obj, 'name') getattr(obj, 'func') # #### 設置obj成員 #### setattr(obj, 'age', 18) setattr(obj, 'show', lambda num: num + 1) # #### 刪除obj成員 #### delattr(obj, 'name') delattr(obj, 'func')