Python的getattr函数方法学习使用示例
作者:waws520 发布时间:2021-10-18 13:43:25
标签:Python,getattr,函数
__getattr__函数的作用: 如果属性查找(attribute lookup)在实例以及对应的类中(通过__dict__)失败, 那么会调用到类的__getattr__函数;
如果没有定义这个函数,那么抛出AttributeError异常。由此可见,__getattr__一定是作用于属性查找的最后一步
举个栗子:
class A(object):
def __init__(self, a, b):
self.a1 = a
self.b1 = b
print('init')
def mydefault(self, *args):
print('default:' + str(args[0]))
def __getattr__(self, name):
print("other fn:", name)
return self.mydefault
a1 = A(10, 20)
a1.fn1(33)
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:40
File "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 value
if __name__ == '__main__':
od = ObjectDict(asf = {'a': 1}, d = True)
print(od.asf, od.asf.a) # {'a': 1} 1
print(od.d) # True
来源:https://juejin.cn/post/7119458309400166437


猜你喜欢
- 这篇文章主要介绍了sql获取存储过程返回数据过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 需求:查询表dbo.Message,每页10条,查询第2页1:TOP()SELECT TOP(20) * FROM dbo.Message
- 引入为什么要有垃圾回收机制Python中的垃圾回收机制简称(GC),我们在程序的运行中会产生大量的变量用于保存数据,而有时候有些变量已经没有
- 本文实例讲述了PHP实现从上往下打印二叉树的方法。分享给大家供大家参考,具体如下:问题从上往下打印出二叉树的每个节点,同层节点从左至右打印。
- File->Setting找到Appearance & Behavior -->System Setting,在右边窗口
- 如下所示:#文件内容 lisilock = open("lock_info.txt", "r+",e
- 本文实例为大家分享了PyQt5实现简单计算器的具体代码,供大家参考,具体内容如下下面我们将介绍使用python的PyQt5图形界面来编写一个
- python 调用系统ffmpeg进行视频截图,并进行图片http发送ffmpeg ,视频、图片的各种处理。 最近在做视频、图片
- 如果把通过函数或方法调用,明确的将某种类型转换成另一种类型称为显示转换 ,相反则称为隐式类型转换 。google和 * 中没有找到“显示类
- 一、安装ROS-OpenCV安装OpenCVsudo apt-get install ros-kinetic-vision-opencv l
- 引言一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点:1、不开源,价格贵2、软件容量大。一般3G以上,
- 最近因工作需要,要在静态页面上实现分页,想了下,决定用AJAX来实现,所以就捣鼓了下面这么个东西,截图如下:更多关于分页的文章演示地址:ht
- 一、logging日志模块等级常见log级别从高到低:CRITICAL 》ERROR 》WARNING 》INFO 》DEBUG,默认等级为
- 每当有新员工入职,人事小姐姐都要收集大量的工资卡信息,并且生成Excel文档,看到小姐姐这么辛苦,我就忍不住要去帮她了&hellip
- ASP.NET WEB FORMS 给开发者提供了极好的事件驱动开发模式。然而这种简单的应用程序开发模式却给我
- 问题描述:用 Python 实现函数 count_words(),该函数输入字符串 s 和数字 n,返回 s 中 n 个出现频率
- 微信更新后出来了一块比较火的小游戏,要是一款不涉及到排行的游戏,可能 没人去关注这款游戏。最开自己一直苦练技术,想在微信排行上面装一装,练了
- 1.0 获取浏览器窗口坐标 python目录可找到Webdriver.py 文件定义了get_window_rect()函数,可获取窗口的坐
- 前言摘要之前写了一篇 grpool goroutine池详解 | 协程管理 收到了大家积极的反馈,今天这篇来做一下grpool的性能测试分析
- Python 正则表达式正则表达式本身是独立于编程语言的知识,但是它又依附于编程语言,基本上我们所使用的编程语言都提供了对它的实现,当然了,