python中的内置函数getattr()介绍及示例


Posted in Python onJuly 20, 2014

在python的官方文档中:getattr()的解释如下:

getattr(object, name[, default])

Return the value of the named attribute of object. name must be a string. If the string is the name of one of the object's attributes, the result is the value of that attribute. For example, getattr(x, 'foobar') is equivalent to x.foobar. If the named attribute does not exist, default is returned if provided, otherwise AttributeError is raised.

根据属性名称返回对象值。如果“name”是对对象属性的名称,则返回对应属性的值。

'# -*- coding: utf-8 -*-'

__author__ = 'lucas'

class attrtest(object):

  def __init__(self):
    pass

  def trygetattr0(self):
    self.name = 'lucas'
    print self.name
    #equals to self.name
    print getattr(self,'name')

  def attribute1(self,para1):
    print 'attribute1 called and '+ para1+' is passed in as a parameter'

  def trygetattr(self):
    fun = getattr(self,'attribute1')
    print type(fun)
    fun('crown')

if __name__=='__main__':
  test = attrtest()
  print 'getattr(self,\'name\') equals to self.name '
  test.trygetattr0()
  print 'attribute1 is indirectly called by fun()'
  test.trygetattr()
  print 'attrribute1 is directly called'
  test.attribute1('tomato')

 这段代码执行的结果是:

getattr(self,'name') equals to self.name 
lucas
lucas
attribute1 is indirectly called by fun()
<type 'instancemethod'>
attribute1 called and crown is passed in as a parameter
attrribute1 is directly called
attribute1 called and tomato is passed in as a parameter

Process finished with exit code 0

第一个函数tryattribute0()非常好理解,就如同定义里说的一样。第二个函数tryattribute1()就有一点费解了。其实原理并不复杂,我们看到fun的type是 instancemethod,这里你可以认为:对于函数,getattr()的返回值是一个指针,指针赋值给接受它的变量,以后call这个变量就等于调用变量指向的函数。

原理我们知道了,那getattr的作用是什么呢?

你熟悉java或者c#中的反射么?反射的一个重要作用就是延迟加载,这样可以解耦,这样可以让系统运行的更有效率。作为动态语言,python显然在这方面要更加强大,

getattr()就是实现python反射的一块积木,结合其它方法如setattr(),dir() 等,我们可以做出很多有趣的事情。

我们看以下场景:

1.我需要在一个类中动态添加其它类中有的方法:

#如果类A中有如下方法:
def addnewattributesfromotherclass(self,class_name):
    func_names = dir(class_name)
    for func_name in func_names:
      if not func_name.startswith('_'):
        new_func = getattr(class_name,func_name)
        self.__setattr__(func_name,new_func())

我们只需要:

a = A()

b = B()

a.addnewattributesfromotherclass(b)

这样a就可以调用B中的'非私有'方法啦。

Python 相关文章推荐
Python手机号码归属地查询代码
May 04 Python
如何利用Fabric自动化你的任务
Oct 20 Python
Python实现的双色球生成功能示例
Dec 18 Python
Python使用Matplotlib实现雨点图动画效果的方法
Dec 23 Python
Python3实现的Mysql数据库操作封装类
Jun 06 Python
opencv python 傅里叶变换的使用
Jul 21 Python
python基础知识(一)变量与简单数据类型详解
Apr 17 Python
Django数据库类库MySQLdb使用详解
Apr 28 Python
python实现统计代码行数的小工具
Sep 19 Python
keras中的loss、optimizer、metrics用法
Jun 15 Python
python3中TQDM库安装及使用详解
Nov 18 Python
教你怎么用Python生成九宫格照片
May 20 Python
Python实现的生成自我描述脚本分享(很有意思的程序)
Jul 18 #Python
Python中使用 Selenium 实现网页截图实例
Jul 18 #Python
Python中使用PyHook监听鼠标和键盘事件实例
Jul 18 #Python
python中使用pyhook实现键盘监控的例子
Jul 18 #Python
python使用pyhook监控键盘并实现切换歌曲的功能
Jul 18 #Python
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
Jul 18 #Python
python采集博客中上传的QQ截图文件
Jul 18 #Python
You might like
Yii实现显示静态页的方法
2016/04/25 PHP
PHP7 参数处理机制修改
2021/03/09 PHP
javascript不同页面传值的改进版
2008/09/30 Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
2012/09/20 Javascript
javascript 正则表达式相关应介绍
2012/11/27 Javascript
JS无限极树形菜单,json格式、数组格式通用示例
2013/07/30 Javascript
jQuery中unbind()方法用法实例
2015/01/19 Javascript
js动态生成Html元素实现Post操作(createElement)
2015/09/14 Javascript
纯javascript移动优先的幻灯片效果
2015/11/02 Javascript
jQuery基于json与cookie实现购物车的方法
2016/04/15 Javascript
js实现5秒倒计时重新发送短信功能
2017/02/05 Javascript
AngularJS与BootStrap模仿百度分页的示例代码
2018/05/23 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
详解操作虚拟dom模拟react视图渲染
2018/07/25 Javascript
vue19 组建 Vue.extend component、组件模版、动态组件 的实例代码
2019/04/04 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
2020/03/13 Javascript
[59:00]OG vs TNC 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[43:41]OG vs Newbee 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python 条件判断的缩写方法
2008/09/06 Python
Python3实现的腾讯微博自动发帖小工具
2013/11/11 Python
Django开发中复选框用法示例
2018/03/20 Python
Django单元测试中Fixtures的使用方法
2020/02/26 Python
python自动生成sql语句的脚本
2021/02/24 Python
Auchan Direct波兰:欧尚在线杂货店
2016/10/19 全球购物
Lacoste澳大利亚官网:服装、鞋类及配饰
2018/11/14 全球购物
国际贸易专业个人职业生涯规划
2014/02/15 职场文书
《三袋麦子》教学反思
2014/03/02 职场文书
孝老爱亲模范事迹材料
2014/05/25 职场文书
班训口号大全
2014/06/18 职场文书
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
2014领导班子正风肃纪思想汇报
2014/09/18 职场文书
渠道运营商合作协议书范本
2014/10/06 职场文书
重阳节主题班会
2015/08/17 职场文书
选调生挂职锻炼工作总结
2015/10/23 职场文书
解决numpy数组互换两行及赋值的问题
2021/04/17 Python
Java并发编程之原子性-Atomic的使用
2022/03/16 Java/Android