点拦截方法__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}