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) ...
随机推荐
- 微软职位内部推荐-Sr. SE - Office incubation
微软近期Open的职位: Senior Software Engineer-Office Incubation Office China team is looking for experienced ...
- FTP地址
访问不了FTP的同学可以试试用IPv6 地址2001:da8:203:ed5:CEB2:55FF:FE8B:ED1来访问,用户名密码不变.
- 爬虫项目之NABC
Need 在如今的互联网市场上相关的网络爬虫软件已然很多,要想赢得客户,高效.稳定.创新都必不可少的. 我们初步阅读和运行了上一届团队的项目,决定从以下几个方面修改和完善创新这一项目: 1.改善对爬取 ...
- 第一个spring,总结!
陈志棚:界面跳转与框架 李天麟:游戏界面ui 徐侃:算法代码的设计 经过五天的时间,开会时候分配的任务,已经全部完成,在这期间中,我们遇到了一些问题.但是,经过android老师的指导后,app成功的 ...
- 软件工程学习之小学四则混合运算出题软件 Version 1.00 设计思路及感想
对于小学四则混合运算出题软件的设计,通过分析设计要求,我觉得为了这个软件在今后便于功能上的扩充,可以利用上学期所学习的<编译原理>一课中的LL1语法分析及制导翻译的算法来实现.这样做的好处 ...
- CMake系列之一:概念
不同的make工具遵循不同的规范和标准,因此针对不同的标准需要不同的Makefile文件.CMake利用一种平台无关的CMakeList.txt文件定制编译流程,根据目标用户的平台生成本地化的Make ...
- Windows 创建计划任务 实现自动同步文件.
0 感觉自己还是缺乏让计算机去工作的思维, 缺少编程和算法的想法与实践做法. 0x1 打开计划任务 方法: 运行-> 输入 control -> 大图标->管理工具 打开任务计划程序 ...
- bzip2 以及 tar 压缩/解压缩/.打包等工具软件
1. bzip2 命令 基础格式: bzip2 [Options] file1 file2 file3 指令选项:(默认功能为压缩) -c //将输出写至标准输出 -d //进行解压操作 -v //输 ...
- Java 工厂方法模式
在工厂对象上调用创建方法,生成接口的某个实现的对象 通过这种方式,接口与实现分离 方法接口 /** * 方法接口 */ public interface Service { void method1( ...
- java学习一 path与classpath
path 任意目录下执行 javac JAVA classpath找到指定目录下的.class文件 前提是进入该文件目录里面 生成.class文件; 变量 的两个特性:1.约束了类型 2.约束了范围 ...