Python __getattr__,__setattr__,__getattribute__,__delattr__介绍

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不存在
"""

 

posted @ 2025-07-21 14:35  CJTARRR  阅读(6)  评论(0)    收藏  举报