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 实现自动远程登陆scp文件实例代码
Mar 13 Python
使用Python对Access读写操作
Mar 30 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
Nov 06 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
Jan 05 Python
对python中的try、except、finally 执行顺序详解
Feb 18 Python
python pandas 时间日期的处理实现
Jul 30 Python
快速解决jupyter启动卡死的问题
Apr 10 Python
简单了解Python变量作用域正确使用方法
Jun 12 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
Jul 14 Python
Python根据字典的值查询出对应的键的方法
Sep 30 Python
使用gunicorn部署django项目的问题
Dec 30 Python
深度学习tensorflow基础mnist
Apr 14 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
php阻止页面后退的方法分享
2014/02/17 PHP
PHP中4个加速、缓存扩展的区别和选用建议
2014/03/12 PHP
zf框架的数据库追踪器使用示例
2014/03/13 PHP
PHP面向对象学习之parent::关键字
2017/01/18 PHP
PHP CURL使用详解
2019/03/21 PHP
PHP抽象类与接口的区别详解
2019/03/21 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
2019/06/12 PHP
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
基于jquery的$.ajax async使用
2011/10/19 Javascript
JavaScript对象的property属性详解
2014/04/01 Javascript
Nodejs中自定义事件实例
2014/06/20 NodeJs
JavaScript中的parse()方法使用简介
2015/06/12 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
2017/01/29 Javascript
基于Vue2.0的分页组件
2017/03/16 Javascript
详解JavaScript按概率随机生成事件
2017/08/02 Javascript
ES7中利用Await减少回调嵌套的方法详解
2017/11/01 Javascript
mongoose设置unique不生效问题的解决及如何移除unique的限制
2017/11/07 Javascript
Mac下安装vue
2018/04/11 Javascript
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
浅谈javascript中的prototype和__proto__的理解
2019/04/07 Javascript
vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)
2019/04/12 Javascript
javascript的惯性运动实现代码实例
2019/09/07 Javascript
Vue-Ant Design Vue-普通及自定义校验实例
2020/10/24 Javascript
python+pyqt5实现KFC点餐收银系统
2019/01/24 Python
介绍一款python类型检查工具pyright(推荐)
2019/07/03 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
python实现身份证实名认证的方法实例
2019/11/08 Python
Python关于__name__属性的含义和作用详解
2020/02/19 Python
Python 解析xml文件的示例
2020/09/29 Python
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
物流专业大学生的自我鉴定
2013/11/13 职场文书
结婚保证书范文
2014/04/29 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
工程竣工验收申请报告
2015/05/15 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js