python3面对像进阶--__getattribute__()

__getattr__回顾:


class Foo:

    def __init__(self,x):

        self.x = x

    def __getattr__(self,item):

        print('执行的是我')

        # return self.__dict__[item]

f1 = Foo(10)

print(f1.x)  # 10

f1.xxxxxx    # 不存在的属性访问,触发__getattr__

__getattribute__


class Foo:

    def __init__(self,x):

        self.x = x

    def __getattribute__(self,item):

        print('不管是否存在,我都会执行')

f1 = Foo(10)

f1.x

f1.xxxxxx

raise AttributeError()


class Foo:

    def __init__(self,item):

        print('执行的是我')

        # return self.__dict__[item]

    def __getattribute__(self,我都会执行')

        raise AttributeError('哈哈')

f1 = Foo(10)    # 不管是否存在,我都会执行    

f1.x              # 执行的是我

f1.xxxxxx         # 不管是否存在,我都会执行 → 执行的是我

# 当__getattribute__与__getattr__同时存在,只会执行__getattrbute__,

# 除非__getattribute__在执行过程中抛出异常AttributeError

再次注意:当__getattribute__()与__getattr__()同时存在,只会执行__getattrbute__(),除非__getattribute__()在执行过程中抛出异常AttributeError




其实相当于__getattribute__()是__getattr__()的老大,当__getattribute__()方法抛出异常AttributeError()时,自动调用__getattr()__。


__getattr()__只接受AttributeError()的错误信息才运行。其他错误信息一律不接受。




__getattr()__只接受AttributeError()的错误信息代码示例:


class Foo:

    def __init__(self,我都会执行')

        raise TabError('哈哈')

f1 = Foo(10)

f1.x

f1.xxxxxx

__getattr()__只接受AttributeError()的错误信息运行结果:


不管是否存在,我都会执行

Traceback (most recent call last):

  File "H:/Flask/shiyanlou/laonanhai/__getattribute__.py",line 43,in <module>

    f1.x

  File "H:/Flask/shiyanlou/laonanhai/__getattribute__.py",line 39,in __getattribute__

    raise TabError('哈哈')

TabError: 哈哈


相关文章

本文从多个角度分析了vi编辑器保存退出命令。我们介绍了保存...
Python中的回车和换行是计算机中文本处理中的两个重要概念,...
SQL Server启动不了错误1067是一种比较常见的故障,主要原因...
信息模块是一种可重复使用的、可编程的、可扩展的、可维护的...
本文从电脑配置、PyCharm版本、Java版本、配置文件以及程序冲...
本文主要从多个角度分析了安装SQL Server 2012时可能出现的错...