class Test:
def __getattr__(self, item):
"""
当访问不存在属性时调用
:param item:
:return:
"""
print(f"获取{item}属性-2")
# 仅属性不存在时调用,优先级低于__getattribute__
raise AttributeError(f"属性{item}不存在")
def __setattr__(self, key, value):
"""
所有属性赋值时调用,包括__init__初始化时赋值
:param key:
:param value:
:return:
"""
print(f"设置属性{key}")
super().__setattr__(key, value) # 规范推荐
# 或者
# self.__dict__[key] = value # 不推荐
# 直接操作实例字典会绕过描述符的__set__方法
def __getattribute__(self, item):
"""
所有属性访问时调用,不管属性是否存在
:param item:
:return:
"""
print(f"获取{item}属性-1")
# 必须用super().__getattribute__取值,否则无限递归.
return super().__getattribute__(item)
def __delattr__(self, item):
"""
删除属性时调用
:param item:
:return:
"""
print(f"{item}被删除")
super().__delattr__(item)
test = Test()
test.name = "test"
print(test.name)
del test.name
print(test.name)
"""
输出:
设置属性name
获取name属性-1
test
name被删除
获取name属性-1
获取name属性-2
...
...
AttributeError: 属性name不存在
"""