【4.5】python的getattr(),setattr(),delattr(),hasattr()

getattr(),setattr(),delattr(),hasattr()为常用的对象属性处理内置函数。

一、getattr()

获取对象引用getattr

class A:   
	def __init__(self):   
		self.name = 'zhangjing'  
	#self.age='24'
	def method(self):   
		print"method print"  
  
Instance = A()   
print getattr(Instance , 'name, 'not find') #如果Instance 对象中有属性name则打印self.name的值,否则打印'not find'
print getattr(Instance , 'age', 'not find')   #如果Instance 对象中有属性age则打印self.age的值,否则打印'not find'
print getattr(a, 'method', 'default')   
#如果有方法method,否则打印其地址,否则打印default   
print getattr(a, 'method', 'default')()   
#如果有方法method,运行函数并打印None否则打印default  

注:使用getattr可以轻松实现工厂模式。 例:一个模块支持html、text、xml等格式的打印,根据传入的formate参数的不同,调用不同的函数实现几种格式的输出

import statsout   
def output(data, format="text"):                                
	 output_function = getattr(statsout, "output_%s" % format)   
return output_function(data)  

二、setattr

这是相对应的getattr()。参数是一个对象,一个字符串和一个任意值。字符串可能会列出一个现有的属性或一个新的属性。这个函数将值赋给属性的。该对象允许它提供。例如,setattr(x,“foobar”,123)相当于x.foobar = 123。

	>>> class test():
	...     name="xiaohua"
	...     def run(self):
	...             return "HelloWord"
	...
	>>> t=test()
	>>> hasattr(t, "age")   #判断属性是否存在
	False
	>>> setattr(t, "age", "18")   #为属相赋值,并没有返回值
	>>> hasattr(t, "age")    #属性存在了
	True
	>>>

三、delattr

与setattr()相关的一组函数。参数是由一个对象(记住python中一切皆是对象)和一个字符串组成的。string参数必须是对象属性名之一。该函数删除该obj的一个由string指定的属性。delattr(x, ‘foobar’)=del x.foobar

四、hasattr用于确定一个对象是否具有某个属性

语法: hasattr(object, name) -> bool 判断object中是否有name属性,返回一个布尔值。

class FooClass:
	pass
k = FooClass()
k.someAtt = 2
k.att
输出:
Traceback (most recent call last):
  File "Untitled.py", line 6, in 
	k.att
AttributeError: FooClass instance has no attribute 'att'

方法一:

class FooClass:
pass

k = FooClass()
try:
#do some thing you need
print k.att
except AttributeError as e:
#error: has not attribute
pass

方法二:调用hasattr方法

hasattr(object, name)

说明:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的)。 参数object:对象。 参数name:特性名称。

	>>> hasattr(list, 'append')
	True
	>>> hasattr(list, 'add')
	False

方法三:使用dir方法

objlist = dir(k)
if 'att' in objlist:
	#do some thing you need
	print k.att
else:
	#error: has not attribute
pass


	>>> li=["zhangjing","zhangwei"]
	>>> getattr(li,"pop")
	>>> li.pop
	>>> li.pop()
	'zhangwei'
	>>> getattr(li,"pop")()
	'zhangjing'
	
	>>>getattr(li, "append")("Moe")
	
一种综合的用法是:判断一个对象的属性是否存在,若不存在就添加该属性。

	>>> class test():
	...     name="xiaohua"
	...     def run(self):
	...             return "HelloWord"
	...
	>>> t=test()
	>>> getattr(t, "age")    #age属性不存在
	Traceback (most recent call last):
	  File "", line 1, in 
	AttributeError: test instance has no attribute 'age'
	>>> getattr(t, "age", setattr(t, "age", "18")) #age属性不存在时,设置该属性
	'18'
	>>> getattr(t, "age")  #可检测设置成功
	'18'
	>>>

参考资料:

https://segmentfault.com/q/1010000000713465/a-1020000000713505

http://www.cnblogs.com/zhangjing0502/archive/2012/05/16/2503702.html

http://www.cnblogs.com/cenyu/p/5713686.html

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn