zoukankan      html  css  js  c++  java
  • python中getattr函数 hasattr函数

    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() 等,我们可以还可以做出很多有趣的事情。

                                                                      

  • 相关阅读:
    [Android编程心得]Debug的一些技巧
    理解WebKit和Chromium: Chromium for Android
    java compiler level does not match the version of the installed java project facet
    [Android编程心得]Activity的生命周期函数
    GDAL中的SURF算法
    SURF算法学习心得
    遥感图像处理流程
    软件界面建模浅析
    IsPostBack深入探讨
    自定义应用程序配置文件(app.config)
  • 原文地址:https://www.cnblogs.com/panwenbin-logs/p/5583669.html
Copyright © 2011-2022 走看看