1. 程式人生 > 其它 >面對物件4 Mixins機制 內建方法 反射 異常

面對物件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("出異常了")  # 再丟擲異常