python中的内置函数getattr()介绍及示例,pythongetattr
python中的内置函数getattr()介绍及示例,pythongetattr
在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的内置方法,希望能用一个简单的例子帮到你:
=========test.py
class a(object):
name = "Jim"
def __setattr__(self,name,value):
self.__dict__[name] = value
def __getattr__(self,name):
return name
b = a()
print dir(b)
print b.__dict__
print b.name
print b.notexists
print
b.name = "change"
print dir(b)
print b.__dict__
print b.name
print b.notexists
===========运行结果========
%python test.py
['__class__', '__delattr__', '__dict__', '__doc__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'name']
{}
Jim
notexists
['__class__', '__delattr__', '__dict__', '__doc__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'name']
{'name': 'change'}
change
notexists
============================
可以看到刚开始的时候b的__dict__对象里面是空的没有东西,当我们使用b.name访问的时候直接访问到的之前定义好的name属性:"Jim"
当我们使用b.name = "change"后就默认调用了内置方法__setattr__,此时我并没有直接操作self.name属性,而是直接在修改了self.__dict__['name'] = 'change'.之后当我再用b.name访问的时候获得的......余下全文>>
相关内容
- 用python代码做configure文件,
- python中from module import * 的一个坑,pythonmodule
- python 示例分享---逻辑推理编程解决八皇后,python逻辑推
- python实现多线程采集的2个代码例子,python多线程
- python中使用urllib2伪造HTTP报头的2个方法,pythonurllib2
- Python中使用urllib2防止302跳转的代码例子,pythonurllib2
- python中使用urllib2获取http请求状态码的代码例子,pyth
- python基于mysql实现的简单队列以及跨进程锁实例详解,
- Python编程语言的35个与众不同之处(语言特征和使用技
- Python中的并发编程实例,python并发编程实例
评论关闭