class TestCase:
    att_1 = 'hello'  # 定义类属性
    att_2 = 'python'

    def test_func(self):  # 定义方法
        print("这是一个方法")

    def __getattribute__(self, item):
        # 属性访问拦截器:当对象访问属性时,会自动触发这个方法,由这个方法来决定返回的属性值
        # 应用场景:访问不存在的属性时,不希望它报错,可以用try--except来捕获异常返回一个值或提示信息
        # try:
        #     return super().__getattribute__(item)  # 调用父类真正的__getattribute__方法返回正确的属性值
        # except AttributeError:
        #     print(item,':该属性不存在!')
        # 如果使用了try方法就不会触发__getattr__方法了,因为找不到属性时的异常已经在这里被捕获了
        print("我是__getattribute__,我正在工作")
        return super().__getattribute__(item)    # 调用父类的方法,返回找到的结果,不调用就不会返回

    def __getattr__(self, att_name):
        # 当对象访问属性时,属性不存在,引发异常,会被__getattr__方法捕获
        # 然后执行该方法的代码,相当于自带捕获异常
        print("我是__getattr__,我正在工作")
        return att_name + "这是我要找的东西,但是我找不到"

    def __setattr__(self, att_name, value):
        # 设置属性的时候就会触发该方法
        print("我是__setattr__,我正在工作")
        super().__setattr__(att_name, value)    # 调用父类的方法,设置属性,不调用就不会真的设置属性

    def __delattr__(self, att_name):
        print("我是__delattr__,我正在工作")
        print("这是我即将删除的东西{}".format(att_name))
        super().__delattr__(att_name)   # 调用父类的方法,删除属性,不调用就删除不了


res = TestCase()  # 实例化对象
print('-----------------访问属性----------------')
print(res.att_1)    # 访问类属性,通过运行结果看res实例对象访问属性时通过了方法__getattribute__

print('\n-----------------访问不存在的属性----------------')
print(res.att_3)

print('\n-----------------设置属性----------------')
res.att_3 = 'new_attr'

print('\n-----------------删除属性----------------')
del res.att_3

原创文章,转载请注明出处:http://124.221.219.47/article/456231/