面對物件4 Mixins機制 內建方法 反射 異常
Mixins機制
為什麼要有:子類繼承父類的時候,可能會碰到需要繼承多個父類的情況,那麼繼承關係也分主類和輔類,既保持主類的功能,也有輔類的功能。
命名方式,我們需要將主類和輔類區分開來,python 對於mixin類的命名方式一般以 Mixin, able, ible 為字尾,然後一般按照規範,呼叫的時候輔類應該在主類的左邊。
class Vehicle: # 交通工具 pass class FlyableMixin: def fly(self): ''' 飛行功能相應的程式碼 ''' print("I am flying") class CivilAircraft(FlyableMixin, Vehicle): # 民航飛機 pass class Helicopter(FlyableMixin, Vehicle): # 直升飛機 pass class Car(Vehicle): # 汽車 pass
內建方法
定義在類的內部,雙下劃線開頭並以上下劃線結尾的方法
它的特點是,在某種情況下會自動觸發執行
為了定製化我的類或者物件
str內建方法
# __str__下面return什麼,列印物件就會打印出來什麼,但返回值必須是str型別才可以,否則會報錯,當然,這個內建方法裡如果有程式碼,也會在列印物件的時候,觸發執行 class People(): def __init__(self,name,age): self.name = name self.age = age def __str__(self): return '名字:%s 年齡:%s'%(self.name,self.age) obj = People('jesse','13') print(obj) # 輸出結果 名字:jesse 年齡:13
del內建方法
# 在刪除物件時觸發,會先執行該方法
class People():
def __init__(self,name,age):
self.name = name
self.age = age
def __del__(self):
print('run...') # 用來標記執行了該方法
obj = People('jesse','13')
del obj
# 在程式執行完畢之後也會觸發執行該方法,因為這涉及到一個記憶體回收機制,當這個物件的記憶體被回收,就相當於執行了刪除操作
相對比較重要的
isinstance
isinstance() 函式來判斷一個物件是否是一個已知的型別,類似 type()。
語法:isinstance(object, classinfo)
object -- 例項物件。
classinfo -- 可以是直接或間接類名、基本型別或者由它們組成的元組
如果物件的型別與引數二的型別(classinfo)相同則返回 True,否則返回 False。
a = 2
isinstance (a,int)
# True
isinstance (a,str)
# False
isinstance (a,(str,int,list)) # 是元組中的一個返回 True
# True
issubclass
issubclass()方法用於判斷引數 class 是否是型別引數 classinfo 的子類
語法:issubclass(class, classinfo)
- class -- 類。
- classinfo -- 類。
如果 class 是 classinfo 的子類返回 True,否則返回 False。
class A:
pass
class B(A):
pass
print(issubclass(B,A))
# 返回 True
getattr方法
# __getattr__方法
# 訪問類或者物件裡面的一個屬性,如果不存在就會執行該方法,且會同時預設返回None,可以設定返回值
class Foo:
x = 1
def __init__(self, y):
self.y = y
def __getattr__(self,item):
print('from getattr==>屬性不存在')
setattr方法
為物件設定值的時候觸發,物件中屬性中有值的時候也會觸發
delattr方法
刪除值的時候觸發
call方法
calss Foo:
def __init__(self):
pass
def __call__(self,*args,**kwargs):
print('__call__')
obj = Foo()
obj()
# 輸出 __call__
# 在物件加括號到用的時候就會執行__call__方法
greater than 大於 python中簡寫成 gt
less than 小於 python中簡寫成 lt
equal 等於 e
大於等於 gte
小於等於 lte
反射
python是動態語言,而反射(reflection)機制被視為動態語言的關鍵。
反射機制指的是在程式的執行狀態中
對於任意一個類,都可以知道這個類的所有屬性和方法;
對於任意一個物件,都能夠呼叫他的任意方法和屬性。
這種動態獲取程式資訊以及動態呼叫物件的功能稱為反射機制
簡而言之就是通過字串來操作類方法
getattr
class Student(): school = 'Beijing' obj = Student()print(getattr(obj,'school',None))# 獲取物件中的屬性 物件名,屬性名字串形式,沒有的話返回值
hasattr
class Student(): school = 'Beijing' obj = Student()print(hasattr(obj,'school'))# 判斷物件中有沒有該屬性 有的話返回 True 沒有返回False
setattr
class Student(): school = 'Beijing' obj = Student()setattr(obj, 'x', 100)print(obj.__dict__)# 輸出結果 {'x': 100}# 更改值
delattr
# delattr 函式用於刪除屬性# delattr(obj, 'x') 相等於 del obj.xclass Student(): school = 'Beijing' obj = Student()delattr(Student,'school')
擴充套件(重要)
class Foo(): def func(self): print('func') obj = Fooprint(getattr(obj,'func')) # ==><function Foo.func at 0x1016f1670> 得到一個函式記憶體地址# 那麼我們加括號就可以執行這個記憶體地址getattr(obj,'func')()# 輸出結果 func
異常處理
1、什麼是異常
異常是程式發生錯誤時的訊號,程式一旦出錯就會丟擲異常
2、為什麼要處理異常
為了增強程式的健壯性,即便程式在執行過程中出錯了,也不要終止程式,而是捕捉異常並處理:將出錯資訊記錄到日誌內
3、如何處理
錯誤的兩大來源
3.1語法上的錯誤
if 1 >3 print('run') # SyntaxError 語法錯誤 在程式執行前就改正
3.2邏輯上的錯誤
l = ['a','b']l[2] # 取了一個不存在的索引
針對邏輯上的異常又分成兩種處理方式
錯誤發生是可以預知的,那我們就可以用if判斷來解決該問題
如果是不可預知的,那我們必須要用異常處理語法來解決
try:
子程式碼塊
# 有可能會丟擲異常的程式碼
except 異常型別1 as e:
pass
except 異常型別2 as e:
pass
except Exception as e: # 萬能異常
pass
...
else:
如果被檢測的子程式碼塊沒有異常發生,則會執行else的子程式碼
finally:
不管有沒有異常都會執行finally的子程式碼
需要注意的是 else 需要和 except 搭配使用
丟擲異常
Python 使用 raise 語句丟擲一個指定的異常。
raise語法格式如下:
raise [Exception [, args [, traceback]]]
# 如果x大於5就觸發異常x = 10if x > 5: raise Exception('x 不能大於 5。x 的值為: {}'.format(x))
自定義異常
你可以通過建立一個新的異常類來擁有自己的異常。異常類繼承自 Exception 類,可以直接繼承,或者間接繼承
class Myexception(BaseException):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return "異常資訊:%s" % self.msgraise Myexception("出異常了") # 再丟擲異常