python中的__getattr__、__getattribute__、__setattr__、__delattr__、__dir__
__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__的更多相关文章
- Python中__get__, __getattr__, __getattribute__的区别及延迟初始化
本节知识点 1.__get__, __getattr__, __getattribute__的区别 2.__getattr__巧妙应用 3.延迟初始化(lazy property) 1.__get__ ...
- Python魔法方法之属性访问 ( __getattr__, __getattribute__, __setattr__, __delattr__ )
通常情况下,我们在访问类或者实例对象的时候,会牵扯到一些属性访问的魔法方法,主要包括: ① __getattr__(self, name): 访问不存在的属性时调用 ② __getattribute_ ...
- python中__get__,__getattr__,__getattribute__的区别
__get__,__getattr__和__getattribute都是访问属性的方法,但不太相同. object.__getattr__(self, name) 当一般位置找不到attribute的 ...
- Python中__get__ ,__getattr__ ,__getattribute__用法与区别?
class C(object): a = 'abc' def __getattribute__(self, *args, **kwargs): print("__getattribute__ ...
- python3中__get__,__getattr__,__getattribute__的区别
__get__,__getattr__和__getattribute都是访问属性的方法,但不太相同. object.__getattr__(self, name) 当一般位置找不到attribute的 ...
- 类中的__getattr__ 与 __setattr__ 魔法方法
1.__getattr__ 当我们访问一个不存在的属性的时候,会抛出异常,提示我们不存在这个属性.而这个异常就是__getattr__方法抛出的,其原因在于他是访问一个不存在的属性的最后落脚点,作为异 ...
- python 中__setattr__, __getattr__,__getattribute__, __call__使用方法
object._getattr_(self, name) 拦截点号运算.当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法.如果继承树可以找到该属性,则不调用此方法 实例in ...
- python基础----isinstance(obj,cls)和issubclass(sub,super)、反射、__setattr__,__delattr__,__getattr__、二次加工标准类型(包装)
一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否ob ...
- python中__getattr__和__setattr__
代码: #!/usr/bin/env python #! -*- coding:utf-8 -*- class A(object): def __setattr__(self, key, value) ...
随机推荐
- 12.18daily_scrum
本软件中的最后一个界面——“关于”界面的设计已经开始进行,数据传输的内容也差不多进行过半,最主要的任务依旧在测试过程中,我们组接下来还是要大力加强测试的强度和数量,注意边际数据和错误数据的测试处理: ...
- 【SE】Week1 : 四则运算题目生成器批改器程序总结
用户需求详见:http://www.cnblogs.com/jiel/p/4810756.html 1)PSP表格分析(预计耗时): PSP2.1 Personal Software Process ...
- 电梯V1.0
电梯V1.0 GitHub仓库地址 Problem 一栋3层的大楼(楼层编号0-2),设有一台无限载重的电梯,初始时电梯停在0层.电梯移动1层的耗时为1,在某一层停靠的耗时为1(时间初始为0).电梯不 ...
- Linux下使用NTFS格式移动硬盘
https://zhidao.baidu.com/question/66517344.html https://zhidao.baidu.com/question/586036510.html htt ...
- Docker(三)-Docker中Image、Container与Volume的迁移
Image 镜像的迁移,适用于离线环境. 一般离线环境,都会自建Docker Registry. 无论 官方的 ,还是最近流行的 Harbor ,都是不错的选择. 但是,这个世界上就是有些环境,或者说 ...
- 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 ...
- 阿里云ECS提示RHSA-2017:3263: curl security update
服务器配置: 原因阿里云安装的CentOS 7.3的curl和libcurl的源不是最新的,会导致安全漏洞出现 方法首先还是要在实例列表远程连接打开终端. 1.更新ca-bundle1.备份: cp ...
- 【题解】Oulipo
题目描述 给出两个串S1,S2(只有大写字母),求S1在S2中出现了多少次. 例如:S1=“ABA”,S2=“ABABA”,答案为2. 输入T组数据,对每组数据输出结果. 输入输出格式 输入格式 第一 ...
- (转)JDK1.8新特性Lambda表达式
https://www.cnblogs.com/franson-2016/p/5593080.html Predicate predicate接收一个变量,并返回一个boolean值,predicat ...
- Ubuntu 16.04搭建LAMP开发环境
基本设置 1.配置网络环境 管理员给分配了一个静态IP,所以还需要进一步配置网络环境 配置DNS:右上角网络连接->编辑链接->有线连接1->IPv4设置->DNS服务器:20 ...