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

发表评论

电子邮件地址不会被公开。 必填项已用*标注