hasattr(object, name)
作⽤:判断对象object是否包含名为name的特性(hasattr是通过调⽤getattr(ojbect, name)是否抛出异常来实现的)。⽰例:
>>> hasattr(list, 'append')True >>> hasattr(list, 'add')False
getattr(object,name,default):
作⽤:返回object的名称为name的属性的属性值,如果属性name存在,则直接返回其属性值;如果属性name不存在,则触发AttribetError异常或当可选参数default定义时返回default值。
这个⽅法最主要的作⽤是实现反射机制。也就是说可以通过字符串获取⽅法实例。这样,你就可以把⼀个类可能要调⽤的⽅法放在配置⽂件⾥,在需要的时候动态加载。
下⾯我们使⽤⼩例⼦来说明它们的⽤法:
import func_file #⾃定义python模块cs=input('请输⼊要访问的URL:')if cs=='loggin': func_file.loggin()if cs =='home': func_file.home()if cs =='':
pass#以下省略
当我定义⼀个⾃定义模块,去调⽤其中的⽅法的时候,使⽤if去判断时,如果模块内⽤很多⽅法,会⼤⼤影响开发的效率,代码冗余差,显然这是不可取的。下⾯我们使⽤hasattr()函数来实现我们的需求:⽰例如下:
import func_file #⾃定义python模块,需事先存在def run(): while True:
cs=input('请输⼊要访问的URL:')
#hasattr利⽤字符串的形式去对象(模块)中操作(寻找)成员
if hasattr(func_file,cs): #判断⽤户输⼊的URL是否在func_file模块中 func=getattr(func_file,cs) #有则将func_file模块下的cs函数赋值 func() #等同于执⾏func_file模块下的cs函数 else:
print('404')#定义错误页⾯run()
我们导⼊⼀个⾃定义模块后,gatattr可以根据输⼊的内容动态加载,利⽤hasattr()函数来判断⽤户输⼊的是否存在,不存在则调⽤⾃定义⽅法。
是不是感觉和我们打开⽹址URL很类似啊!
上⼀个⽰例有⼀个问题,在实际情况中,我们的功能函数可能存放在很多模块中,每⼀个都需要单独导⼊,那我们可不可以利⽤getattr()函数去动态加载模块呢?当然可以啦请看⽰例:
def run(): while True:
cs=input('请输⼊:')
v,k=cs.split('/') #获得输⼊的模块和模块的⽅法
obj=__import__('lib.'+v,fromlist=True) #调⽤lib⽬录下的模块fromlist=True按路径连接的⽅式导⼊ if hasattr(obj,k): f= getattr(obj,k) f() else:
print('404')
if __name__ == '__main__': run()
是不是感到getattr很强⼤啊。其实,getattr()就是实现python反射的⼀块积⽊,结合其它⽅法如setattr(),dir() 等,我们可以还可以做出很多有趣的事情。
因篇幅问题不能全部显示,请点此查看更多更全内容