1. 程式人生 > >Python進階-----類的裝飾器及應用

Python進階-----類的裝飾器及應用

回顧什麼是裝飾器:
  裝飾器定義:本質就是函式(高階函式),功能是為其他函式(物件)新增新功能

一、類的裝飾器基本實現原理如下:

1 def deco(cls):
2     print('類的裝飾器=========》')
3     print('='*20)
4     return cls
5 
6 @deco      #====> Foo = deco(Foo)
7 class Foo:
8     pass

二、上述的簡單裝飾器是沒有引數的,現在我們加上引數

 1 def cls_decorator(**kwargs):            #支援傳入引數(屬性和對應的值),字典形式
2 def deco(cls): 3 for key,val in kwargs.items(): 4 setattr(cls,key,val) #給類設定對應的屬性和值 5 return cls 6 return deco 7 8 @cls_decorator(name='Menawey',age=24,gender='male') # 1 執行cls_decorator(...),返回deco;2 @deco===> Peolple = deco(People) 9
#相當於給People類設定了name、age、gender屬性 10 class People: 11 pass 12 13 print(People.__dict__) #檢視被裝飾過的類的屬性字典

   通過這樣就可以動態的給不同的類在他例項化前增加屬性

三、結合描述符
  通過描述符和類的裝飾器組合使用,可以完成很多功能,比如為類新增屬性,並且可以限定屬性的型別。

 1 #描述符
 2 class Desc:
 3     def __init__(self,key,value_type):
 4
self.key = key 5 self.value_type = value_type 6 def __get__(self, instance, owner): 7 return instance.__dict__[self.key] 8 def __set__(self, instance, value): 9 if not isinstance(value,self.value_type): 10 raise TypeError('%s 傳入的型別不是 %s'%(self.key,self.value_type)) 11 instance.__dict__[self.key] = value 12 def __delete__(self, instance): 13 instance.__dict__.pop(self.key) 14 15 #裝飾器 16 def cls_decorator(**kwargs): #支援傳入引數(屬性和對應的值),字典形式 17 def deco(cls): 18 for key,val in kwargs.items(): #這裡需要用到描述符對屬性進行代理,但是val是指定的型別,所以要用Desc(key,val)來描述為對應的值 19 setattr(cls,key,Desc(key,val)) #給類設定對應的屬性和值 20 return cls 21 return deco 22 23 @cls_decorator(name=str,age=int,gender=str,salary=float) #使用裝飾器 24 25 #被裝飾和描述的類 26 class People: 27 def __init__(self,name,age,gender,salary): 28 self.name = name 29 self.age = age 30 self.gender = gender 31 self.salary = salary 32 33 p1 = People('Menawey',24,'male',11.1) #因為gender屬性指定的是sstr,但是TypeError: age 傳入的型別不是 <class 'int'> 34 print(People.__dict__)