博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中的__getattr__、__getattribute__、__setattr__、__delattr__、__dir__
阅读量:5256 次
发布时间:2019-06-14

本文共 2868 字,大约阅读时间需要 9 分钟。

__getattr__:

     属性查找失败后,解释器会调用 __getattr__ 方法.

class TmpTest:    def __init__(self):        self.tmp = 'tmp123'    def __getattr__(self, item):        raise AttributeError('{} object has no attribute {}'.format(type(self), item))a=TmpTest()print(a.tmp)结果:    tmp123print(a.tmpnone)结果:    Traceback (most recent call last):      File "D:/pythonScript/leetcode/leetcode.py", line 12, in 
print(a.tmpnone) File "D:/pythonScript/leetcode/leetcode.py", line 7, in __getattr__ raise AttributeError(msg.format(tmp_cls, item)) AttributeError:
object has no attribute tmpnone

 a.tmpnone 表达式执行顺序:

       1、首先会检查a实例有没有名为tmpnone的属性
       2、到类(a.__class__)中查找
       3、顺着继承树继续查找.
       4、调用a所属类中定义的 __getattr__ 方法,传入self和属性名称的字符串形式(如 'tmpnone').

__getattribute__:
 1、尝试获取指定的属性时总会调用这个方法,寻找的属性是特殊属性或特殊方法时除外.
    2、点号与 getattr 和 hasattr 内置函数会触发这个方法.
    3、调用 __getattribute__ 方法且抛出 AttributeError 异常时,才会调用 __getattr__ 方法.
    4、为了在获取实例的属性时不导致无限递归,__getattribute__ 方法的实现要使用 super().__getattribute__(name)

class TmpTest:    def __getattr__(self, item):        print("getting __getattr__ {}".format(item))        self.__dict__[item] = '__getattr__'        return '__getattr__'    def __getattribute__(self, item):        print ("getting __getattribute__ {}".format(item))        if item=='x':            raise AttributeError        return object.__getattribute__(self, item)    def __setattr__(self, key, value):        print("getting __setattr__ {}".format(key))        return object.__setattr__(self, key, value)a=TmpTest()a.x='getattr'print (a.x)结果:getting __setattr__ x   getting __getattribute__ x       #抛出异常getting __getattr__ x            #执行__getattr__getting __getattribute__ __dict__  __getattr__

__setattr__:
    尝试设置指定的属性时会调用这个方法.点号和 setattr 内置函数会触发这个方法.例如我们上面的例子a.x='getattr'和 setattr(a, 'x', "getattr") 都会触发 TmpTest.__setattr__(a, 'x', "getattr") 方法.,
    如果实现了 __getattr__ 方法,最好同时定义 __setattr__ 方法
__delattr__:
    只要使用del语句删除属性,就会调用这个方法.例如,del a.x 语句触发 Class.__delattr__(a, 'x') 方法
    实现方法:

def __delattr__(self, item):        print ("getting __delattr__ {}".format(item))        del self.__dict__[item]

dir():
    1、在没有参数的情况下,返回当前作用域内的名称列表。
    2、如果对象有一个名为dir()的方法,那么这个方法就会被调用
    3、模块对象,返回模块的属性列表
    4、类对象,返回累的属性名称和基类的属性列表
看下官方的文档例子:

>>> import struct    >>> dir()   # show the names in the module namespace      ['__builtins__', '__name__', 'struct']        >>> dir(struct)   # show the names in the struct module    ['Struct', '__all__', '__builtins__', '__cached__', '__doc__', '__file__',     '__initializing__', '__loader__', '__name__', '__package__',     '_clearcache', 'calcsize', 'error', 'pack', 'pack_into',     'unpack', 'unpack_from']         >>> class Shape:    ...     def __dir__(self):    ...         return ['area', 'perimeter', 'location']    >>> s = Shape()    >>> dir(s)    ['area', 'location', 'perimeter']

 

转载于:https://www.cnblogs.com/flashBoxer/p/9686059.html

你可能感兴趣的文章
java实现哈弗曼树
查看>>
转:Web 测试的创作与调试技术
查看>>
python学习笔记3-列表
查看>>
程序的静态链接,动态链接和装载 (补充)
查看>>
关于本博客说明
查看>>
线程androidAndroid ConditionVariable的用法
查看>>
stap-prep 需要安装那些内核符号
查看>>
转载:ASP.NET Core 在 JSON 文件中配置依赖注入
查看>>
socket初识
查看>>
磁盘测试工具
查看>>
代码变量、函数命名神奇网站
查看>>
redis cli命令
查看>>
Problem B: 占点游戏
查看>>
python常用模块之sys, os, random
查看>>
HDU 2548 A strange lift
查看>>
Linux服务器在外地,如何用eclipse连接hdfs
查看>>
react双组件传值和传参
查看>>
[Kaggle] Sentiment Analysis on Movie Reviews
查看>>
价值观
查看>>
mongodb命令----批量更改文档字段名
查看>>