__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)
结果:
tmp123 print(a.tmpnone)
结果:
Traceback (most recent call last):
File "D:/pythonScript/leetcode/leetcode.py", line 12, in <module>
print(a.tmpnone)
File "D:/pythonScript/leetcode/leetcode.py", line 7, in __getattr__
raise AttributeError(msg.format(tmp_cls, item))
AttributeError: <class '__main__.TmpTest'> 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']

python中的__getattr__、__getattribute__、__setattr__、__delattr__、__dir__的更多相关文章

  1. Python中__get__, __getattr__, __getattribute__的区别及延迟初始化

    本节知识点 1.__get__, __getattr__, __getattribute__的区别 2.__getattr__巧妙应用 3.延迟初始化(lazy property) 1.__get__ ...

  2. Python魔法方法之属性访问 ( __getattr__, __getattribute__, __setattr__, __delattr__ )

    通常情况下,我们在访问类或者实例对象的时候,会牵扯到一些属性访问的魔法方法,主要包括: ① __getattr__(self, name): 访问不存在的属性时调用 ② __getattribute_ ...

  3. python中__get__,__getattr__,__getattribute__的区别

    __get__,__getattr__和__getattribute都是访问属性的方法,但不太相同. object.__getattr__(self, name) 当一般位置找不到attribute的 ...

  4. Python中__get__ ,__getattr__ ,__getattribute__用法与区别?

    class C(object): a = 'abc' def __getattribute__(self, *args, **kwargs): print("__getattribute__ ...

  5. python3中__get__,__getattr__,__getattribute__的区别

    __get__,__getattr__和__getattribute都是访问属性的方法,但不太相同. object.__getattr__(self, name) 当一般位置找不到attribute的 ...

  6. 类中的__getattr__ 与 __setattr__ 魔法方法

    1.__getattr__ 当我们访问一个不存在的属性的时候,会抛出异常,提示我们不存在这个属性.而这个异常就是__getattr__方法抛出的,其原因在于他是访问一个不存在的属性的最后落脚点,作为异 ...

  7. python 中__setattr__, __getattr__,__getattribute__, __call__使用方法

    object._getattr_(self, name) 拦截点号运算.当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法.如果继承树可以找到该属性,则不调用此方法 实例in ...

  8. python基础----isinstance(obj,cls)和issubclass(sub,super)、反射、__setattr__,__delattr__,__getattr__、二次加工标准类型(包装)

    一.isinstance(obj,cls)和issubclass(sub,super)                                isinstance(obj,cls)检查是否ob ...

  9. python中__getattr__和__setattr__

    代码: #!/usr/bin/env python #! -*- coding:utf-8 -*- class A(object): def __setattr__(self, key, value) ...

随机推荐

  1. 12.18daily_scrum

    本软件中的最后一个界面——“关于”界面的设计已经开始进行,数据传输的内容也差不多进行过半,最主要的任务依旧在测试过程中,我们组接下来还是要大力加强测试的强度和数量,注意边际数据和错误数据的测试处理: ...

  2. 【SE】Week1 : 四则运算题目生成器批改器程序总结

    用户需求详见:http://www.cnblogs.com/jiel/p/4810756.html 1)PSP表格分析(预计耗时): PSP2.1 Personal Software Process ...

  3. 电梯V1.0

    电梯V1.0 GitHub仓库地址 Problem 一栋3层的大楼(楼层编号0-2),设有一台无限载重的电梯,初始时电梯停在0层.电梯移动1层的耗时为1,在某一层停靠的耗时为1(时间初始为0).电梯不 ...

  4. Linux下使用NTFS格式移动硬盘

    https://zhidao.baidu.com/question/66517344.html https://zhidao.baidu.com/question/586036510.html htt ...

  5. Docker(三)-Docker中Image、Container与Volume的迁移

    Image 镜像的迁移,适用于离线环境. 一般离线环境,都会自建Docker Registry. 无论 官方的 ,还是最近流行的 Harbor ,都是不错的选择. 但是,这个世界上就是有些环境,或者说 ...

  6. nginx提示Job for nginx.service failed because the control的问题

    启动nginx时就报错!Job for nginx.service failed because the control process exited with error code. See &qu ...

  7. 阿里云ECS提示RHSA-2017:3263: curl security update

    服务器配置: 原因阿里云安装的CentOS 7.3的curl和libcurl的源不是最新的,会导致安全漏洞出现 方法首先还是要在实例列表远程连接打开终端. 1.更新ca-bundle1.备份: cp ...

  8. 【题解】Oulipo

    题目描述 给出两个串S1,S2(只有大写字母),求S1在S2中出现了多少次. 例如:S1=“ABA”,S2=“ABABA”,答案为2. 输入T组数据,对每组数据输出结果. 输入输出格式 输入格式 第一 ...

  9. (转)JDK1.8新特性Lambda表达式

    https://www.cnblogs.com/franson-2016/p/5593080.html Predicate predicate接收一个变量,并返回一个boolean值,predicat ...

  10. Ubuntu 16.04搭建LAMP开发环境

    基本设置 1.配置网络环境 管理员给分配了一个静态IP,所以还需要进一步配置网络环境 配置DNS:右上角网络连接->编辑链接->有线连接1->IPv4设置->DNS服务器:20 ...