点拦截方法__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'}
#Python小白学习交流群:725638078
#[] 取值赋值
DD["age"] = 20
print(DD["age"]) # 20
print(DD) # {'name': 'shawn', 'age': 20}