1. 程式人生 > >面向對象多繼承 異常處理

面向對象多繼承 異常處理

lose acl exce 範圍 一個 種類 表頭 報錯 關閉數據庫

總結
1 多繼承
2封裝,多態  :比如定義一個變量  a=  這裏a可以賦值多種類型比如字典列表,字符串等  Python 本身就是默認多態的
3 super()方法
4 類的約束
5 異常處理


多繼承的順序 和 super()方法

‘‘‘
class A:
    def func1(self):
        # super().func()
        print(self,‘A‘)
class B():
    def func(self):
        super().func()

        print(self,‘這是B‘)
class C():
    def func(self):
        # super().func()
        print(self,‘這是C‘)
class D(B,C):   #當你執行這個func方法時 先走B,B走完後,如果B裏邊沒有super 就不會跳到下一步去在找C,
    def func(self):
        super().func()
        #super這個位置括號裏邊其實是super(B,self)
        # 第一個參數是類,第二個是參數self 那個對象調用的就是那個對象的內存地址,
        #若不是B,改為C的話直接跳到C這個位置,就不走B了
        print(self,‘這是D‘)
python中類的分類:
python2x版本:
    python2.2之前,只有經典類,python2.2之後出現了新式類.
    經典類: 不繼承object類. 多繼承遵循深度優先.
        class A:
            pass
    新式類: 繼承object的類. 多繼承遵循c3算法,mro方法.
        class A(object):
            pass

python3x版本: 所有類都默認繼承object.
    只有新式類.

‘‘‘ 深度優先: 從左至右,一條路走到底. 新式類的多繼承: C3算法. ‘‘‘ class O: pass class D(O): pass class E(O): pass class F(O): pass class B(D,E): pass class C(E,F): pass class A(B,C): pass obj = A() print(A.mro()) mro(C(A,B)) = [C] + merge(mro(A),mro(B),[A,B]) mro(B(A)) = [B,A] mro(B(A1,A2,A3)) = [B] + merge(mro(A1),mro(A2),mro(A3),[A1,A2,A3]) [A,B,C] 表頭:A 表尾: B,C [A] 表頭: A ,表尾: 空. [A] + [B] = [A,B] # 如果計算merge裏面的順序: merge([A,O], [C,E,F,O],[C]) # [A] + merge([O], [C,E,F,O],[C]) # [A,C] + merge([O], [E,F,O]) A.mro(B,C)=[A] + merge(mro(B),mro(C),[B,C]) A.mro(B,C)=[A] + merge([B,D,E,O],[C,E,F,O],[B,C]) [A,B,D,C,E,F,O] mro(B)=B.mro(D,E)=[B] + merge(mro(D),mro(E),[D,E]) mro(D)=[D,O] mro(E)=[E,O] mro(B)=B.mro(D,E)=[B] + merge([D,O],[E,O],[D,E]) --[B,D,E,O] mro(C)=C.mro(E,F)=[C] + merge(mro(E),mro(F),[E,F]) mro(E)=[E,O] mro(F)=[F,O] mro(C)=C.mro(E,F)=[C] + merge([E,O],[F,O],[E,F])--[C,E,F,O]
‘‘‘ 4類的約束 強制我的子類必須有某種方法 .主動拋異常 rice 一下 方法一 主動拋異常 rice 一下 :歸一化設計,在鴨式基礎上去 添加.一個接口.把不同的類,相同方法 作為一個函數放調用 方法二 抽象類 接口類 : 制定一個規範,強制子類必須有pay方法,如果沒有,在你實例化的時候就會報錯. 第一種方式 :Python最常用的方式. 列: class Payment: def pay(self,money): raise Exception (錯誤提示語句) class Alipay(Payment):
def pay(self,money): print(你使用阿裏支付了%s%money) class Wecahat(Payment): def pay(self,money): print(您使用了微信支付了%s%money) class QQpay(Payment): def pay(self,money): print(您使用了QQ支付了%s%money) def pay(obj,money):#統一了支付方式.歸一化設計 obj.pay(money) 方式 二: from abc import ABCMeta,abstractclassmethod #沒有這個方法時子類是不可以生成對象的 class Payment(metaclass=ABCMeta): @abstractclassmethod def pay(self,money): pass class Alipay(Payment): def pay(self,money): print(您是使用了啊裏支付了%s%money) class Wechatpay(Payment): def pay(self, money): print(您用微信支付了%s元 % money) class Applepay(Payment): def pay(self, money): print(您用蘋果支付了%s元 % money) def pay(obj, money): # 統一了支付方式:歸一化設計 obj.pay(money) # obj2.pay(200) # # 5 異常處理 # 異常錯誤分類 1.語法異常 輸入的代碼錯誤 直接飄紅 2.邏輯錯誤 不會直接飄紅 但是,邏輯是錯誤的 比如查索引的時候超過下標 代碼執行了後 才會出現的錯誤 如何處理這些邏輯錯誤. 異常錯誤信息 錯誤類型, 一,異常處理 1.先捕捉 2.在進行處理 二,異常處理的倆種方式 if 預防 用if處理異常劣勢: 1,對於相同的錯誤類型,你要用大量的重復代碼處理異常. 2,如果異常種類較多,利用if 你得代碼會出現冗余(無用代碼過多). try : except 異常處理, 代碼異常報錯,但是可以執行 expcet 下的代碼 1, 單支 try: 一個try pass except IndexError(錯誤類型 不定) 一個錯誤類型 2. 多支 try: pass pass except IndexError as e: 可以接收對應的報錯 print(e) 可以打印,可不打印 except KeyError as e: 可以接收對應的報錯 print(e) except ValueError as e: 可以接收對應的報錯 print(e) 3. 萬能異常 try except Exception try: pass pass except Exception: 可以接收多個錯誤類型 繼續走下面代碼 pass 如果 你只想將異常處理掉,對錯誤信息不關心,用萬能異常. 如果 你需要根據不同的錯誤信息而執行不同的邏輯(分流),那麽用多分支,或者多分支加萬能異常 4, 多分支 + 萬能 try except else else : 如果出現異常,就不執行else 否則執行else語句. try: pass pass except ValueError: pass except Exception: pass else: pass try except (else) finally finally 出不出現異常都執行,異常出現前執行fianlly. 用途: 1關閉文件句柄,關閉數據庫鏈接. 2 函數return之前能夠執行finally代碼. 3, break之前可以執行finally. 例題 try: f = open(aaa, encoding=utf-8,mode=w) f.write(fdsafsd) # 文件件句柄操作的代碼非常多 except Exception: print(333) else: print(666) finally: # print(‘執行‘) f.close() 7 raise 主動拋出異常 raise IndexError(超出索引範圍) 8 assert 在源碼中常出現 斷言 表示一個強硬的態度,不滿足條件直接報錯 9 自定義

面向對象多繼承 異常處理