`

小谈Python的getattr函数

阅读更多

通过 getattr 获取对象引用

 

你已经知道 Python 函数是对象。 你不知道的是,使用 getattr 函数,可以得到一个直到运行时才知道名称的函数的引用。

 

>>>li = ["Larry", "Curly"]

>>>li.pop                      

<built-in method pop of list object at 010DF884>

>>>getattr(li, "pop")     

<built-in method pop of list object at 010DF884>

>>>getattr(li, "append")("Moe")

>>>li

["Larry", "Curly", "Moe"]

>>>getattr({}, "clear")        

<built-in method clear of dictionary object at 00F113D4>

>>>getattr((), "pop")

 

用于模块的 getattr

 

getattr 不仅仅适用于内置数据类型,也可作用于模块。

 

 

>>>import odbchelper

>>>odbchelper.buildConnectionString   
          
<function buildConnectionString at 00D18DD4>

>>>getattr(odbchelper, "buildConnectionString") 

<function buildConnectionString at 00D18DD4>

>>>object = odbchelper

>>>method = "buildConnectionString"

>>>getattr(object, method)     
                 
<function buildConnectionString at 00D18DD4>

>>>type(getattr(object, method))      
          
<type 'function'>

>>>import types

>>>type(getattr(object, method)) == types.FunctionType

True

>>>callable(getattr(object, method))     
       
True
 

 

getattr 作为一个分发者

 

getattr 常见的使用模式是作为一个分发者。举个例子,如果你有一个程序可以以不同的格式输出数据,你可以为每种输出格式定义各自的格式输出函数,然后使用唯一的分发函数调用所需的格式输出函数。
例如,让我们假设有一个以 HTML、XML 和普通文本格式打印站点统计的程序。输出格式在命令行中指定,或者保存在配置文件中。statsout 模块定义了三个函数:output_html、output_xml 和 output_text。然后主程序定义了唯一的输出函数,如下:

 

import statsout

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

    return output_function(data)
 

你是否发现前面示例的一个 Bug?即字符串和函数之间的松耦合,而且没有错误检查。如果用户传入一个格式参数,但是在 statsout 中没有定义相应的格式输出函数,会发生什么呢?还好,getattr 会返回 None,它会取代一个有效函数并被赋值给 output_function,然后下一行调用函数的语句将会失败并抛出一个异常。这种方式不好。
值得庆幸的是,getattr 能够使用可选的第三个参数,一个缺省返回值。

 

import statsout

def output(data, format="text"):

    output_function = getattr(statsout, "output_%s" % format, statsout.output_text)

    return output_function(data) 
 

这个函数调用一定可以工作,因为你在调用 getattr 时添加了第三个参数。第三个参数是一个缺省返回值,如果第二个参数指定的属性或者方法没能找到,则将返回这个缺省返回值。

 

分享到:
评论

相关推荐

    浅谈python中的getattr函数 hasattr函数

    下面小编就为大家带来一篇浅谈python中的getattr函数 hasattr函数。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Python getattr()函数使用方法代码实例

    主要介绍了Python getattr()函数使用方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Python中getattr函数和hasattr函数作用详解

    主要介绍了Python中getattr函数和hasattr函数作用的相关知识,非常不错具有参考借鉴价值,需要的朋友可以参考下

    浅谈 Python 魔法函数 __getattr__ 与 __getattribute__

    魔法函数 getattr 与 getattribute 简单说明 __getattr__ 与 __getattribute__ 魔法函数的使用 目录魔法函数 __getattr__ 与 __getattribute____getattr__魔法函数作用__getattribute__魔法函数总结 书上说,天下...

    python中getattr函数使用方法 getattr实现工厂模式

    看了下函数本身的doc复制代码 代码如下:getattr(object, name[, default]) -&gt; value Get a named attribute from an object; getattr(x, ‘y’) is equivalent to x.y. When a default argument is given, it is ...

    浅谈使用Python内置函数getattr实现分发模式

    主要介绍了浅谈使用Python内置函数getattr实现分发模式,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    在Python中通过getattr获取对象引用的方法

    getattr函数 (1)使用 getattr 函数,可以得到一个直到运行时才知道名称的函数的引用。 &gt;&gt;&gt; li = ["Larry", "Curly"] &gt;&gt;&gt; li.pop // 该语句获取列表的 pop 方法的引用,注意该语句并不是调用 pop 方法,调用 pop ...

    python中的内置函数getattr()介绍及示例

    在python的官方文档中:getattr()的解释如下: getattr(object, name[, default]) Return the value of the named attribute of object. name must be a string. If the string is the name of one of the object's...

    Python通过getattr函数获取对象的属性值

    getattr(object, name[, default]) Return the value of the named attribute of object. name must be a string. If the string is the name of one of the object’s attributes, the result is the value of that...

    python中根据字符串调用函数的实现方法

    在多进程中,可能传递过来的是一个字符串,那么我怎么来调用一个已经存在的函数呢,主要就是使用到getattr函数的作用,这个函数就是在使用字符串得到这个字符串对应的函数的对象,然后就可以进行执行,如下所示: ...

    全面了解Python的getattr(),setattr(),delattr(),hasattr()

    1. getattr()函数是Python自省的核心函数,具体使用大体如下: class A: def __init__(self): self.name = 'zhangjing' #self.age='24' def method(self): print"method print" Instance = A() print getattr...

    详解Python的hasattr() getattr() setattr() 函数使用方法

    主要介绍了详解Python的hasattr() getattr() setattr() 函数使用方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

    Python:内置函数

    原文地址 内置函数总表 内置函数 __import__() abs() all() any() ascii() bin() bool() bytearray() bytes() callable() chr() classmethod() ...getattr() globals() hasattr() hash() help()

    浅析Python中的getattr(),setattr(),delattr(),hasattr()

    getattr()函数是Python自省的核心函数,具体使用大体如下: 获取对象引用getattr Getattr用于返回一个对象属性,或者方法 class A: def __init__(self): self.name = 'zhangjing'  #self.age='' def method(self)...

    Python核心编程第二版

     4.6.5 Python类型操作符和内建函数总结   4.7 类型工厂函数   4.8 标准类型的分类   4.8.1 存储模型   4.8.2 更新模型   4.8.3 访问模型   4.9 不支持的类型   4.10 练习   第5章 数字 ...

    Python __setattr__、 __getattr__、 __delattr__、__call__用法示例

    `getattr`函数属于内建函数,可以通过函数名称获取 复制代码 代码如下: value = obj.attribute value = getattr(obj, “attribute”) 使用`getattr`来实现工厂模式 复制代码 代码如下: #一个模块支持html、text、xml...

Global site tag (gtag.js) - Google Analytics