Python的__getattr__方法学习

内容部分来自网络

__getattr__函数的作用: 如果属性查找(attribute lookup)在实例以及对应的类中(通过__dict__)失败, 那么会调用到类的__getattr__函数;

如果没有定义这个函数,那么抛出AttributeError异常。由此可见,__getattr__一定是作用于属性查找的最后一步

举个栗子:

 1 class A(object):
 2     def __init__(self, a, b):
 3         self.a1 = a
 4         self.b1 = b
 5         print('init')
 6 
 7     def mydefault(self, *args):
 8         print('default:' + str(args[0]))
 9 
10     def __getattr__(self, name):
11         print("other fn:", name)
12         return self.mydefault
13 
14 
15 a1 = A(10, 20)
16 a1.fn1(33)
17 a1.fn2('hello')

运行结果:

init
other fn: fn1
default:33
other fn: fn2
default:hello

第16行调用fn1属性时,查找不到次属性,程序调用__getattr__方法

用__getattr__方法可以处理调用属性异常

class Student(object):def __getattr__(self, attrname):if attrname == "age":return 'age:40'else:raise AttributeError(attrname)x = Student()
print(x.age)  # 40
print(x.name)

这里定义一个Student类和实例x,并没有属性age,当执行x.age,就调用_getattr_方法动态创建一个属性,执行x.name时,__getattr__方法没有对其处理,抛出异常

age:40File "XXXX.py", line 10, in <module>print(x.name)File "XXXX.py", line 6, in __getattr__raise AttributeError(attrname)
AttributeError: name

下面展示一个_getattr_经典应用的例子,可以调用dict的键值对

class ObjectDict(dict):def __init__(self, *args, **kwargs):super(ObjectDict, self).__init__(*args, **kwargs)def __getattr__(self, name):value = self[name]if isinstance(value, dict):value = ObjectDict(value)return valueif __name__ == '__main__':od = ObjectDict(asf = {'a': 1}, d = True)print(od.asf, od.asf.a)  # {'a': 1} 1print(od.d)  # True

 

转载于:https://www.cnblogs.com/monogem/p/9765199.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python to_excel新增sheet_Python使用xlrd和xlwt读写Excel的简单用法

前言数据处理是 Python 的一大应用场景&#xff0c;而 Excel 则是最流行的数据处理软件。因此用Python 进行数据相关的工作时&#xff0c;难免要和 Excel 打交道。标准的 Excel 文件&#xff08;xls/xlsx&#xff09;具有较复杂的格式&#xff0c;并不方便像普通文本文件一样直…

linux 线程管理、同步机制等

线程学了那么多有关进程的东西&#xff0c;一个作业从一个进程开始&#xff0c;如果你需要执行其他的东西你可以添加一些进程&#xff0c;进程之间可以通信、同步、异步。似乎所有的事情都可以做了。 对的&#xff0c;进程是当初面向执行任务而开发出来的&#xff0c;每个进程代…

SQL多表连接查询(详细实例)

本文主要列举两张和三张表来讲述多表连接查询。 新建两张表&#xff1a; 表1&#xff1a;student 截图如下&#xff1a; 表2&#xff1a;course 截图如下&#xff1a; &#xff08;此时这样建表只是为了演示连接SQL语句&#xff0c;当然实际开发中我们不会这样建表&#xff0c;…

cf 1059e 思维 贪心 树

参考博客&#xff1a;http://www.cnblogs.com/waldenlake/p/9750249.html 题意&#xff1a;将一棵n个点的带权有根树剖分成尽量少的链&#xff0c;使得 &#xff08;1&#xff09;链的两个端点是祖先关系 &#xff08;2&#xff09;链含有的顶点个数小于等于L &#xff08;3&am…

powermock模拟对象_使用PowerMock模拟构造函数

powermock模拟对象在我看来&#xff0c;依赖注入的主要好处之一是可以将模拟和/或存根对象注入代码中&#xff0c;以提高可测试性&#xff0c;增加测试覆盖率并编写更好&#xff0c;更有意义的测试。 但是&#xff0c;有时候您会遇到一些不使用依赖注入的传统代码&#xff0c;而…

宝塔 没有找到站点_宝塔面板正确开启TLS 1.3并删除TLS 1.1

昨天折腾了一个AlphaSSL泛域名证书后&#xff0c;心血来潮去SSL评分网站测试了一番&#xff0c;最后的结果竟然是B&#xff0c;这真是不能忍啊……为啥会是B&#xff0c;查看了原因&#xff0c;竟然是启用了TLS 1.1&#xff0c;所以为B。那么&#xff0c;删除TLS 1.1不就可以了…

线程同步机制:互斥量、信号量、读写锁、条件变量

一、互斥量&#xff08;mutex&#xff09; 互斥量本质上是一把锁&#xff0c;在访问共享资源前对互斥量进行加锁&#xff0c;在访问完成后释放互斥量上的锁。 对互斥量进行加锁以后&#xff0c;任何其它试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放…

在Cloudfoundry上部署RESTful服务

在本文中&#xff0c;我们将使用Pivotal Cloud Foundry&#xff08;PCF&#xff09;Dev在Cloudfoundry上部署RESTful服务。 由于创建静态Web服务不是本文的一部分&#xff0c;因此我已经创建了employee-service &#xff0c;它具有静态后端&#xff0c;可从GitHub进行克隆。 在…

mysql 全连接查询合并字段

1、创建两张表 t1如下&#xff1a; idname1a13a3 t2如下&#xff1a; idname1b12b25b5 联合查询合并字段&#xff1a; sql语句&#xff1a; SELECT t3.name AS B, t3.name1 AS C ,COALESCE(t3.id2,t3.id1) AS myId FROM (SELECT t1.id as id2 ,t1.name as name,t2.id as id…

小米刷第三方recovery_小米平板4/Plus LTE版本开启电话功能

众所周知&#xff0c;因为入网许可或通信基带使用权限的问题&#xff0c;小米平板4/plus LTE版本通过系统的方式阉割了通话功能&#xff0c;不过硬件完全是支持的&#xff0c;所有还是有办法让你的平板可以像手机一样&#xff0c;可以通话&#xff0c;可以发送短信。过Magisk刷…

最佳线程数总结(1

最佳线程数: 性能压测的情况下&#xff0c;起初随着用户数的增加&#xff0c;QPS会上升&#xff0c;当到了一定的阀值之后&#xff0c;用户数量增加QPS并不会增加&#xff0c;或者增加不明显&#xff0c;同时请求的响应时间却大幅增加。这个阀值我们认为是最佳线程数。 为什么要…

MongoDB和Java(5):Spring Data整合MongoDB(注解配置)

最近花了一些时间学习了下MongoDB数据库&#xff0c;感觉还是比较全面系统的&#xff0c;涉及了软件安装、客户端操作、安全认证、副本集和分布式集群搭建&#xff0c;以及使用Spring Data连接MongoDB进行数据操作&#xff0c;收获很大。特此记录&#xff0c;以备查看。 文章目…

新浪微博爬虫设计(Python版)

最近手头上有一个项目&#xff0c;是关于新浪微博的&#xff0c;其中有一环要做新浪微博的爬虫。虽然之前把《Python学习手册》和《Python核心编程》都囫囵吞栆地通读完了&#xff0c;不过真正到做项目的时候还是什么都不会。于是在网上找了大量的资料。关于获取新浪微博的内容…

python 返回空格_Python面试之 is 和 == 的区别

Python爬虫人工智能学习教程​www.python88.cn面试实习生的时候&#xff0c;当问到 is 和 的区别时&#xff0c;很多同学都答不上来&#xff0c;搞不清两者什么时候返回一致&#xff0c;什么时候返回不一致。本文我们来看一下这两者的区别。我们先来看几个例子&#xff1a;a …

【数据库设计和SQL基础语法】--索引和优化--SQL语句性能调优

一、SQL语句性能调优的基本原则 1.1 确定性能指标 响应时间 SQL语句性能调优的基本原则之一是确定性能指标&#xff0c;而其中最为关键的指标之一就是响应时间。响应时间是衡量数据库系统性能的重要指标&#xff0c;它表示从用户发送一个查询请求到接收到查询结果所经过的时间…

boke练习: spring boot: security post数据时,要么关闭crst,要么添加隐藏域

spring boot: security post数据时&#xff0c;要么关闭crst,要么添加隐藏域 http.csrf().disable();或者&#xff1a; <input name"${_csrf.parameterName}" type"hidden" value"${_csrf.token}">转载于:https://www.cnblogs.com/achengm…

法线有接缝_发送带有接缝的活动邀请

法线有接缝这些天来&#xff0c;我的一位同事在使用带有接缝&#xff08;版本2.x&#xff09;的邮件模板发送事件邀请时遇到了问题。 从根本上讲&#xff0c;这应该不是一项艰巨的任务&#xff0c;因此我将简要说明使用接缝邮件模板发送事件邀请需要做些什么。 发送邮件邀请时&…

LINUX任务(jobs)详解

转自 &#xff1a; http://hi.baidu.com/daweilang/item/58db8d308e54f6d56d15e999LINUX任务(jobs)详解 在用管理员执行一个命令后&#xff0c;用CtrlZ把命令转移到了后台。导致无法退出root的。 输入命令&#xff1a;exit 终端显示&#xff1a;There are stopped jobs. 解决方…

网页爬虫的设计与实现(Java版)

最近为了练手而且对网页爬虫也挺感兴趣&#xff0c;决定自己写一个网页爬虫程序。首先看看爬虫都应该有哪些功能。内容来自&#xff08;http://www.ibm.com/developerworks/cn/java/j-lo-dyse1/index.html?cadrs-&#xff09;网页收集的过程如同图的遍历&#xff0c;其中网页就…

springboot entity date_SpringBoot+JWT实战(附源码)

SpringBoot集成JWT首先我们搭建好SpringBoot框架&#xff0c;SpringBoot环境准备就绪。接下来执行以下操作&#xff1a;1.引入依赖引入JWT依赖,由于是基于Java&#xff0c;所以需要的是java-jwt。<dependency><groupId>com.auth0</groupId><artifactId>…