“包裝”是指對一個已經存在的對象進行系定義加工。
實現授權是包裝的一個特性。包裝一個類型通常是對已存在的類型進行一些自定義定制,這種做法可以新建,修改,或刪除原有產品的某些功能,而其他的保持不變。授權的過程,其實也就是所有的更新功能都交給新類的自定義的某部分功能來處理,但已存在的功能就授權給對象的默認屬性。
實現授權的關鍵點是覆蓋__getattr__()方法,在代碼中包含一個對getattr()內建函數的調用,調用getattr()得到默認對象的屬性,並返回它以便訪問或者調用。
用組合的方式完成授權。
class Cpu:#定義一個Cpu類
def __init__(self,cpubrand,cpuprice):#cpu的屬性有品牌、價格等
self.cpubrand=cpubrand
self.cpuprice=cpuprice
def calc(self):
print("CPU是電腦的大腦,你能進行大量的計算")
class Mainboard:#定義一個主板類
def __init__(self,mbprice,mbsize):#主板的屬性有價格和型號
self.mbprice=mbprice
self.mbsize=mbsize
def connect(self):
print("主板類似於人類的脊椎神經,它能夠將顯卡、聲卡等設備聯系起來")
class Computer:#定義一個電腦類
def __init__(self,comprice,combrand,cpuprice,cpubrand,mbprice,mbsize):
self.comprice=comprice
self.combrand=combrand
self.cpu=Cpu(cpuprice,cpubrand)
self.mainboard=Mainboard(mbprice,mbsize)
def play_game(self):
print("嘿嘿,我們可以用電腦來玩游戲啊")
def __getattr__(self, item): 這一步是實現授權的方式
return getattr(self.cpu,item)
com=Computer(6999,"三星",2345,"intel",1800,'B53')
com.calc()
#com.calc()方法的調用方式,首先,他會從com的屬性字典去查找calc屬性,發現該實例屬性中不存在,然后去Computer類的屬性字典去查找calc屬性,發現也不存在,就觸發了__getattr__()方法,
__getattr__()一運行,就會調用getattr(self.cpu,"calc")方法的運行,得到一個內存地址傳給了com.calc,然后運行。