day8 网络编程 异常处理
一、接口與統一化設計
1.歸一化讓使用者無需關心對象的類是什么,只需要知道這些對象都具備某些功能就可以了,這極大地降低了使用者的使用難度。
2.歸一化使得高層的外部使用者可以不加區分的處理所有接口兼容的對象集合。
繼承的兩種用途:
3.繼承基類的方法,并且做出自己的改變或者拓展(代碼重用):實踐中,繼承的這種用途意義并不是很大,甚至常常是有害的,因為他使得子類與基類出現強耦合。
4.聲明某個子類兼容與某基類,定義一個接口類(模仿java的interface),接口類中定義了一些接口名(就是函數名)且功能,子類繼承接口類,并未實現接口類,并且實現接口類,并且實現接口類中的功能
例子:
class Interface:#定義接口Interface類來模仿接口的概念,python中壓根就沒有interface關鍵字來定義一個接口。def read(self): #定接口函數readpassdef write(self): #定義接口函數writepassclass Txt(Interface): #文本,具體實現read和writedef read(self):print('文本數據的讀取方法')def write(self):print('文本數據的寫方法')class Sata(Interface): #磁盤,具體實現read和writedef du(self):print('硬盤數據的讀取方法')def write(self):print('硬盤數據的寫方法')class Process(Interface):def read(self):print('進程數據的讀取方法')def xie(self):print('進程數據的寫方法')t=Txt() s=Sata() p=Process()t.read() s.read() p.read()以上子類的方法必須要跟父類保持一致,不能強制性子類跟父類保持一致。
以下用抽象類解決此問題
抽象類 import abc class Interface(metaclass=abc.ABCMeta):#定義接口Interface類來模仿接口的概念,python中壓根就沒有interface關鍵字來定義一個接口。all_type='file'@abc.abstractmethoddef read(self): #定接口函數readpass@abc.abstractmethoddef write(self): #定義接口函數writepassclass Txt(Interface): #文本,具體實現read和writedef read(self):passdef write(self):pass t=Txt()print(t.all_type)二.面向對象之封裝
1.只要變量__開頭在類外部不能被引用, 在類內部是可以的
例子:
lass Foo:__N=111111 #_Foo__Ndef __init__(self,name):self.__Name=name #self._Foo__Name=namedef __f1(self): #_Foo__f1print('f1')def f2(self):self.__f1() #self._Foo__f1() f=Foo('egon') # print(f.__N) # f.__f1() # f.__Name # f.f2()這種隱藏需要注意的問題:
這種隱藏只是一種語法上變形操作,并不會將屬性真正隱藏起來
封裝函數屬性:為了隔離復雜度
例子:
三.靜態屬性
例子:
例:BMI指數(bmi是計算而來的,但很明顯它聽起來像是一個屬性而非方法,如果我們將其做成一個屬性,更便于理解)
成人的BMI數值:
過輕:低于18.5
正常:18.5-23.9
過重:24-27
肥胖:28-32
非常肥胖, 高于32
體質指數(BMI)=體重(kg)÷身高^2(m)
EX:70kg÷(1.75×1.75)=22.86
'''
四.反射
通過字符串的形式操作對象相關的屬性。python中的一切事物都是對象(都可以使用反射)
setattr 設置值
getattr 獲取值
delattr 刪除
hasattr 判斷對象有沒有
五、item用法
例子
class Foo:def __getitem__(self, item):print('=====>get')return self.__dict__[item]def __setitem__(self, key, value):self.__dict__[key]=value# setattr(self,key,value)def __delitem__(self, key):self.__dict__.pop(key)六、__str__用法
class People:def __init__(self,name,age,sex):self.name=nameself.age=ageself.sex=sexdef __str__(self): #在對象被打印時觸發執行return '<name:%s age:%s sex:%s>' %(self.name,self.age,self.sex)p1=People('egon',18,'male') p2=People('alex',38,'male')print(p1) print(p2)f=Foo() # f.x=1 # print(f.x) # print(f.__dict__) f['x']=123123123123# del f['x']print(f['x'])七、__del__用法 釋放
如果產生的對象僅僅只是python程序級別的(用戶級),那么無需定義__del__,如果產生的對象的同時還會向操作系統發起系統調用,即一個對象有用戶級與內核級兩種資源,比如(打開一個文件,創建一個數據庫鏈接),則必須在清除對象的同時回收系統資源,這就用到了__del__
八、異常處理
異常就是程序運行時發生錯誤的信號(在程序出現錯誤時,則會產生一個異常,若程序沒有處理它,則會拋出該異常,程序的運行也隨之終止),在python中,錯誤觸發的異常如下
1.1、異常的種類
AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性x
IOError 輸入/輸出異常;基本上是無法打開文件
ImportError 無法引入模塊或包;基本上是路徑問題或名稱錯誤
IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊
IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]
KeyError 試圖訪問字典里不存在的鍵
KeyboardInterrupt Ctrl+C被按下
NameError 使用一個還未被賦予對象的變量
SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了)
TypeError 傳入對象類型與要求的不符合
UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是由于另有一個同名的全局變量,
導致你以為正在訪問它
ValueError 傳入一個調用者不期望的值,即使值的類型是正確的
1.2 異常處理
為了保證程序的健壯性與容錯性,即在遇到錯誤時程序不會崩潰,我們需要對異常進行處理,
如果錯誤發生的條件是可預知的,我們需要用if進行處理:在錯誤發生之前進行預防
例子:
AGE=10 while True:age=input('>>: ').strip()if age.isdigit(): #只有在age為字符串形式的整數時,下列代碼才不會出錯,該條件是可預知的age=int(age)if age == AGE:print('you got it')break如果錯誤發生的條件是不可預知的,則需要用到try...except:在錯誤發生之后進行處理 #基本語法為 try:被檢測的代碼塊 except 異常類型:try中一旦檢測到異常,就執行這個位置的邏輯 #舉例 try:f=open('a.txt')g=(line.strip() for line in f)print(next(g))print(next(g))print(next(g))print(next(g))print(next(g)) except StopIteration:f.close()?
轉載于:https://www.cnblogs.com/wangshaojie/p/7418038.html
總結
以上是生活随笔為你收集整理的day8 网络编程 异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转://使用insert插入大量数据的总
- 下一篇: 安装vs2015