点拦截方法__getatter__,__setattr__, __delattr__

点拦截方法__getatter__,__setattr__, __delattr__

一、点拦截方法__getattr__,__setattr__,__delattr__

注意:

以下的自动触发的前提是操作对象达到某一条件, 自动触发其类中定义的方法。

同理, 类也是对象. 如果实例化类的元类中定义了以下的方法, 那么操作类达到某一条件, 也会自动触发其元类中定义的以下的方法.

  • __setattr__:在[对象].[属性]=[值]设置属性值的时候就会触发它的执行
  • __getattr__:在[对象].[属性] 获取属性不存在的时候会触发它的执行
  • __delattr__ : 在 del [对象].[属性] 删除属性的时候会触发它的执行
class Panda:
    def __init__(self, name):
        self.name = name

    def __getatter__(self, item):
        print("通过点的方式找属性没有找到,于是出发了我")

    def __setattr__(self, key, value):
        print("你通过点的方式修改了属性值,触发了我")
        # self.key = value
        # 如此设置值得时候(又通过点的方式设置), 于是又触发__setattr__的执行, 又开始设置,无限递归了
        self.__dict__[key] = value  # 可以通过操作对象字典key=value方式设置

    def __delattr__(self, item):
        print("通过点的方式删除属性,触发了我")
        # del self.item #与上面一样,无限递归了
        self.__dict__.pop(item)  # 同样通过操作对象字典的方式去删属性


# 实例对象的初始化方法其实也进行了设置属性值的操作
p = Panda("赵总")  # 你通过点的方式修改属性值,触发了我

# 获取一个不存在的属性
p.age  # 通过点的方式找属性没有找到,于是触发了我

# 设置属性值
p.age = 99  # 你通过点的方式修改属性值,触发了我
print(p.__dict__)  # {'name': '赵总', 'age': 99}

# 删除属性

del p.name  # 通过点的方式删除属性,触发了我
print()  # {"age":99}

应用示例

  • 重写字典, 实现字典可以通过点 . 取值赋值, 也可以 [] 取值赋值

    class Mydict(dict):
        def __setattr__(self, key, value):
            self[key] = value
    
        def __getattr__(self, item):
            return self[item]
    
    
    DD = Mydict()
    print(DD)  # {}
    
    # 点取值赋值
    DD.name = "大宝"
    print(DD.name)  # 大宝
    print(DD)  # {'name': '大宝'}
    
    # []取值赋值
    DD["age"] = 20
    print(DD["age"])  # 20  
    print(DD)  # {'name': '大宝', 'age': 20}
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贾维斯Echo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值