【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

个人公众号,比较懒,很少更新,可以在上面提问题:

更多精彩,请移步公众号阅读:

Sam avatar
About Sam
专注生物信息 专注转化医学