国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python類裝飾器實現方法詳解

2020-02-16 00:15:45
字體:
來源:轉載
供稿:網友

本文實例講述了Python類裝飾器。分享給大家供大家參考,具體如下:

編寫類裝飾器

類裝飾器類似于函數裝飾器的概念,但它應用于類,它們可以用于管理類自身,或者用來攔截實例創建調用以管理實例。

單體類

由于類裝飾器可以攔截實例創建調用,所以它們可以用來管理一個類的所有實例,或者擴展這些實例的接口。

下面的類裝飾器實現了傳統的單體編碼模式,即最多只有一個類的一個實例存在。

instances = {} # 全局變量,管理實例def getInstance(aClass, *args):  if aClass not in instances:    instances[aClass] = aClass(*args)  return instances[aClass]   #每一個類只能存在一個實例def singleton(aClass):  def onCall(*args):    return getInstance(aClass,*args)  return onCall為了使用它,裝飾用來強化單體模型的類:@singleton    # Person = singleton(Person)class Person:  def __init__(self,name,hours,rate):    self.name = name    self.hours = hours    self.rate = rate  def pay(self):    return self.hours * self.rate@singleton    # Spam = singleton(Spam)class Spam:  def __init__(self,val):    self.attr = valbob = Person('Bob',40,10)print(bob.name,bob.pay())sue = Person('Sue',50,20)print(sue.name,sue.pay())X = Spam(42)Y = Spam(99)print(X.attr,Y.attr)

現在,當Person或Spam類稍后用來創建一個實例的時候,裝飾器提供的包裝邏輯層把實例構建調用指向了onCall,它反過來調用getInstance,以針對每個類管理并分享一個單個實例,而不管進行了多少次構建調用。

程序輸出如下:

Bob 400
Bob 400
42 42

在這里,我們使用全局的字典instances來保存實例,還有一個更好的解決方案就是使用Python3中的nonlocal關鍵字,它可以為每個類提供一個封閉的作用域,如下:

def singleton(aClass): instance = None def onCall(*args): nonlocal instance if instance == None:  instance = aClass(*args) return instance return onCall

當然,我們也可以用類來編寫這個裝飾器——如下代碼對每個類使用一個實例,而不是使用一個封閉作用域或全局表:

class singleton: def __init__(self,aClass): self.aClass = aClass self.instance = None def __call__(self,*args): if self.instance == None:  self.instance = self.aClass(*args) return self.instance

跟蹤對象接口

類裝飾器的另一個常用場景是每個產生實例的接口。類裝飾器基本上可以在實例上安裝一個包裝器邏輯層,來以某種方式管理其對接口的訪問。

前面,我們知道可以用__getattr__運算符重載方法作為包裝嵌入到實例的整個對象接口的方法,以便實現委托編碼模式。__getattr__用于攔截未定義的屬性名的訪問。如下例子所示:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 岢岚县| 昌都县| 唐山市| 东阿县| 尤溪县| 建昌县| 遵义县| 赤壁市| 西和县| 五常市| 海原县| 武山县| 德兴市| 固阳县| 张家川| 揭西县| 龙山县| 紫阳县| 康平县| 中山市| 榆中县| 隆尧县| 皮山县| 白河县| 礼泉县| 洛南县| 曲麻莱县| 鱼台县| 钟祥市| 阳山县| 行唐县| 阿合奇县| 江都市| 林周县| 洛宁县| 靖西县| 略阳县| 无棣县| 吐鲁番市| 岳阳县| 贵溪市|