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进行基础的函数式编程的教程
Mar 31 Python
简单介绍Python中的struct模块
Apr 28 Python
简单讲解Python中的闭包
Aug 11 Python
python kmeans聚类简单介绍和实现代码
Feb 23 Python
Python的iOS自动化打包实例代码
Nov 22 Python
对Python之gzip文件读写的方法详解
Feb 08 Python
python给微信好友定时推送消息的示例
Feb 20 Python
Python continue语句实例用法
Feb 06 Python
Python模块/包/库安装的六种方法及区别
Feb 24 Python
python zip()函数的使用示例
Sep 23 Python
python如何快速拼接字符串
Oct 28 Python
Python基于Tkinter开发一个爬取B站直播弹幕的工具
May 06 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
Snoopy类使用小例子
2008/04/15 PHP
又一个PHP实现的冒泡排序算法分享
2014/08/21 PHP
javascript 动态添加表格行
2006/06/22 Javascript
Javascript客户端脚本的设计和应用
2006/08/21 Javascript
ext checkboxgroup 回填数据解决
2009/08/21 Javascript
判断文档离浏览器顶部的距离的方法
2014/01/08 Javascript
JavaScript实现关键字高亮功能
2014/11/12 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
js如何判断输入字符串长度
2015/12/16 Javascript
浅谈JavaScript的计时器对象
2016/12/26 Javascript
Vue组件中的data必须是一个function的原因浅析
2018/09/03 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
2018/12/29 jQuery
ES6 Iterator接口和for...of循环用法分析
2019/07/31 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
2019/09/28 Javascript
基于JavaScript伪随机正态分布代码实例
2019/11/07 Javascript
Vue使用自定义指令实现拖拽行为实例分析
2020/06/06 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
2020/09/09 Javascript
[02:59]2014DOTA2西雅图国际邀请赛 圆满落幕中国夺冠
2014/07/23 DOTA
[00:47]TI7不朽珍藏III——沙王不朽展示
2017/07/15 DOTA
解决PyCharm中光标变粗的问题
2017/08/05 Python
Python编程求质数实例代码
2018/01/31 Python
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
Python操作Oracle数据库的简单方法和封装类实例
2018/05/07 Python
python将秒数转化为时间格式的实例
2018/09/16 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
2021/01/15 Python
太阳镜仓库,售价20美元或更少:Sunglass Warehouse
2016/09/28 全球购物
ECHT官方网站:男女健身服
2020/02/14 全球购物
小学语文教学反思
2014/02/10 职场文书
美容院经理岗位职责
2014/04/03 职场文书
英语求职信范文
2014/05/23 职场文书
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
学校党员干部承诺书
2015/05/04 职场文书
学生犯错保证书
2015/05/09 职场文书
日本读研:怎样写好一篇日本研究计划书?
2019/07/15 职场文书