zoukankan      html  css  js  c++  java
  • python类 包装 授权

    “包装”是指对一个已经存在的对象进行系定义加工。

    实现授权是包装的一个特性。包装一个类型通常是对已存在的类型进行一些自定义定制,这种做法可以新建,修改,或删除原有产品的某些功能,而其他的保持不变。授权的过程,其实也就是所有的更新功能都交给新类的自定义的某部分功能来处理,但已存在的功能就授权给对象的默认属性。

    实现授权的关键点是覆盖__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,然后运行。
    在我身后,微笑地活下去吧。
  • 相关阅读:
    03:信号与槽,以字体修改为例
    赞不绝口点赞器原作者的撤项信
    钉钉魔铃 铃声切换器 1.0 项目失败
    KC开发组官方网站
    搜索引擎知识
    现在的手机厂家真浮躁
    02:QT的第一个程序
    第一次做编程语言的英语阅读理解
    mysql 报错[Err] [Dtf] 1292
    Mysql 精确查询是否字段中包含某个字符串
  • 原文地址:https://www.cnblogs.com/L-C98/p/9123504.html
Copyright © 2011-2022 走看看