Python__getattr__、__setattr__、__delattr__、__getitem__、__setitem__、__getattribute__方法的理解
1. __getattr__(self, item):
在访问对象的item属性的时候,如果对象并没有这个相应的属性,方法,那么将会调用这个方法来处理。。。这里要注意的时,假如一个对象叫fjs, 他有一个属性:fjs.name = "fjs",那么在访问fjs.name的时候因为当前对象有这个属性,那么将不会调用__getattr__()方法,而是直接返回了拥有的name属性了
2. __setattr__(self, item, value):
当试图对象的item特性赋值的时候将会被调用。
# -*- coding:utf-8 -*-
class Student:def __init__(self, work, score):self.work = workself.score = scoredef __getattr__(self, item):return item + ' is not exits'def __setattr__(self, key, value):self.__dict__[key] = value#object.__setattr__(self, key, value) 两条语句等效def __delattr__(self, name):print("你正在删除一个属性")return super().__delattr__(name)def __getitem__(self, item):return self.__dict__[item]def __setitem__(self, key, value):self.__dict__[key] = values = Student()
print(s.name) # 调用__getattr__方法 输出'name is not exits'
s.age = 1 # 调用__setattr__ 方法
print(s.age) # 输出 1
print(s['age']) # 调用 __getitem__方法 输出1
s['name'] = 'tom' # 调用 __setitem__ 方法
print(s['name']) # 调用 __getitem__ 方法 输出 'tom'del s.work # 调用__delattr__方法
try:print(s.work) # 输出 'MyClass' object has no attribute 'work'
except AttributeError as reason:print(reason)
输出结果为:
name is not exits
1
1
tom
3. __getattribute__
class C(object):a = 'abc'def __getattribute__(self, *args, **kwargs):print("__getattribute__() is called")return object.__getattribute__(self, *args, **kwargs)
# return "haha"def __getattr__(self, name):print("__getattr__() is called ")return name + " from getattr"def __get__(self, instance, owner):print("__get__() is called", instance, owner)return selfdef foo(self, x):print(x)class C2(object):d = C()
if __name__ == '__main__':c = C()c2 = C2()print(c.a)print(c.zzzzzzzz)c2.dprint(c2.d.a)
输出结果
__getattribute__() is called
abc
__getattribute__() is called
__getattr__() is called
zzzzzzzz from getattr
__get__() is called <__main__.C2 object at 0x16d2310> <class '__main__.C2'>
__get__() is called <__main__.C2 object at 0x16d2310> <class '__main__.C2'>
__getattribute__() is called
abc
Python__getattr__、__setattr__、__delattr__、__getitem__、__setitem__、__getattribute__方法的理解相关推荐
- python 魔法方法之:__getitem__ __setitem__ __delitem__
python的魔法方法: 在Python中,如果我们想实现创建类似于序列和映射的类,可以通过重写魔法方法__getitem__.__setitem__.__delitem__.__len__方法去模拟 ...
- 【转】五、谈扩展方法的理解
[转]五.谈扩展方法的理解 为什么要用扩展方法 在说什么是扩展方法之前我们先来说说为什么要用扩展方法. 首先我们定义一个 Person 类: public class Person {/// < ...
- python threading模块的方法_Python THREADING模块中的JOIN()方法深入理解
看了oschina上的两个代码,受益匪浅.其中对join()方法不理解,看python官网文档的介绍: join([timeout]):等待直到进程结束.这将阻塞正在调用的线程,直到被调用join() ...
- sklearn中GBDT的一些参数、属性、方法的理解
文章目录 GBDT 分类器 引入 重要参数 loss learning_rate subsample n_estimators criterion max_depth min_samples_leaf ...
- 频域分析方法的理解(信号、频谱、能量谱、功率谱、倒频谱、小波分析)(终极教程)
信号频域分析方法的理解(频谱.能量谱.功率谱.倒频谱.小波分析) 参考文献,值得一读 https://blog.csdn.net/fengzhuqiaoqiu/article/details/1011 ...
- hashCode()、equals()以及compareTo()方法的理解
原文出自:http://blog.sina.com.cn/s/blog_50d936c40100nvzz.html hashCode().equals()以及compareTo()方法的理解 转载▼ ...
- [react] 请说说你对react的render方法的理解
[react] 请说说你对react的render方法的理解 render是class组件中必须被重载的方法,组件执行render方法的条件如下: 初始渲染 this.setState方法,参数不能为 ...
- [css] 请描述下你对translate()方法的理解
[css] 请描述下你对translate()方法的理解 Single length/percentage value一个长度值或百分比表示X轴和Y轴使用一样的值进行二维上的平移.等同于transla ...
- C#回调函数应用示例,形象比喻方法助理解
C#回调函数应用示例,形象比喻方法助理解,整理了一个简单的例子来说明回调函数的用法: namespace CallBackFunction { class Program { ...
最新文章
- 中国开源大爆发进行时,你没掉队吧?
- 一秒回到P图前:Adobe发布“反向PS”利器,知道你修过哪里,还帮你修回去
- 计算机科学术语,计算机科学中的术语(2)
- 卷积为什么如此强大?理解深度学习中的卷积
- 2021消费者置业信心指数报告
- 无盘服务器性能测试,无盘系统性能测试及结语
- 一线互联网架构师设计思想解读开源框架!全套教学资料
- 判断当前日期是否在[startDate, endDate]区间
- 《Managed DirectX +C# 开发(入门篇)》系列文章
- 《数学之美》—贾里尼克和现代语言处理
- 日报管理系统_设备维护管理系统的自动化报告功能
- 【毕业设计】基于STM32的公交站牌系统 - 物联网 嵌入式 单片机
- 【游戏策划】【碎碎念】关于横版跳跃类游戏的关卡设计
- et文件丢失怎么恢复?5种恢复方法轻松掌握
- 2022年全球及中国多功能压力锅市场份额预测与投资竞争格局调查报告
- VCC和GND短路,怎么找问题?
- 30A的MOS现在价格都下探到1块了,为什么你还在用继电器?
- 语音助手——多轮会话(理论概念篇)
- 更新数据update
- C语言画伯德图程序,已知系统的传递函数,试绘制系统的伯德图。 (1) (2)
热门文章
- Infographic Modern Graphs Mac(现代信息图表动画fcpx插件)
- seo全攻略_SaaS 企业推广获客全攻略(2):如何做好企业官网?
- 组合数学 算法导论 具体数学 博弈论 计算机科学数学
- vue部署到服务器_利用Gulp实现代码自动化部署
- jsonview浏览器插件 查看格式化json数据
- Java通过反射了解集合泛型的本质(Class反射都是在运行时执行的)
- C++|Qt工作笔记-Windows平台下的句柄与Qt中QWindow::winId()以及 QPlatformWindow::handle的区别与联系
- Qt工作笔记-信号与槽参数匹配问题
- C++ STL string的输出
- 多路查找树之2-3树(理论)