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

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

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

    def __getattr__(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("hangd")  # 你通过点的方式修改属性值,触发了我

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

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

# 🔰删除属性
del P.name          # 通过点的方式删除属性,触发了我
print(P.__dict__)   # {'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 = "shawn"
print(DD.name)    # shawn
print(DD)         # {'name': 'shawn'}

# 🔰[] 取值赋值
DD["age"] = 20
print(DD["age"])  # 20
print(DD)         # {'name': 'shawn', 'age': 20}
posted @ 2020-12-30 12:21  给你骨质唱疏松  阅读(253)  评论(0编辑  收藏  举报