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

作者:hebedich 时间:2023-01-15 19:16:46 

在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,getattr()
0
投稿

猜你喜欢

  • Tensorflow实现在训练好的模型上进行测试

    2022-10-04 07:17:00
  • 使用Python遍历文件夹实现查找指定文件夹

    2021-01-19 09:23:06
  • Python编程argparse入门浅析

    2023-11-05 09:53:01
  • python实现发送邮件

    2021-08-06 04:33:28
  • Go标准库日志打印及同时输出到控制台与文件

    2024-04-26 17:22:40
  • python实现WebSocket服务端过程解析

    2022-09-14 10:45:19
  • python实现简易名片管理系统

    2022-12-23 13:14:53
  • 布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)

    2021-01-02 08:46:49
  • python基于socketserver实现并发,验证客户端的合法性

    2023-04-15 09:05:38
  • oracle学习笔记(二)

    2012-01-05 18:59:20
  • mssql server 存储过程里,bulk insert table from '路径+文件',路径固定,文件名不固定的实现方法

    2024-01-13 17:39:18
  • Javascript编写Asp时需要注意的一些地方

    2008-04-06 14:20:00
  • 浅谈Python中的生成器和迭代器

    2023-04-08 02:23:46
  • php字符串函数 str类常见用法示例

    2024-05-11 10:01:43
  • python抽取指定url页面的title方法

    2022-11-15 21:52:40
  • 关于Django Models CharField 参数说明

    2021-05-01 04:54:12
  • 正则表达式不匹配某个字符串

    2010-03-02 22:08:00
  • kali添加开机自启的方法

    2023-06-06 04:15:06
  • php日期转时间戳,指定日期转换成时间戳

    2023-06-20 17:02:23
  • python3实现往mysql中插入datetime类型的数据

    2024-01-20 12:45:58
  • asp之家 网络编程 m.aspxhome.com