python中format函数用法简书_python 中 getattr() 函数解析

getattr 是一个相当有用的内置函数,用于返回一个对象属性,或者方法。许多人将 python 中的 getattr 称之为反射,这种方法在 python 的一些库及模块中很常见,我使用过的,如在 SocketServer 模块中必须定义 handle 方法,其就是使用反射进行调用的,还有在 django 的中间件中(request -> views –> exception -> reponse) ,这几个方法都是使用反射调用的,此方法的用处非常多,也比较灵活。

先看下官方对此方法的解释:

In [12]: getattr??

Docstring:

getattr(object, name[, default]) -> value

Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.

When a default argument is given, it is returned when the attribute doesn't

exist; without it, an exception is raised in that case.

Type: builtin_function_or_method

参数说明:

object:对象的实例

name:字符串,对象的成员函数的名字或者成员变量

default:当对象中没有该属性时,返回的默认值

异常:当没有该属性并且没有默认的返回值时,抛出”AttrbuteError”

先看一个例子帮你简单理解下反射:

In [24]: import os

In [25]: s = "version"

In [26]: getattr(os.sys,s)

Out[26]: '2.7.10 (default, Nov 20 2015, 12:17:54) \n[GCC 4.4.7 20120313 (Red Hat 4.4.7-16)]'

getattr 可以将字符串作为一个方法进行执行,getattr(os.sys,s) 相当于执行了 os.sys.version 。

getattr 在类中的用法:

#!/usr/bin/env python

# coding=utf-8

class demo(object):

def __init__(self):

self.name = 'feiyu'

def name(self):

print 'a is a method'

def method(self):

print 'method print'

a = demo()

print getattr(a, 'name', 'default')

[root@sta tmp]# python test.py

feiyu

从结果中可以看到 getattr 执行了类中的 name 属性,name 方法并没有执行。

#!/usr/bin/env python

# coding=utf-8

class demo(object):

def __init__(self):

pass

#self.name = 'feiyu'

def name(self):

print 'a is a method'

def method(self):

print 'method print'

a = demo()

print getattr(a, 'name', 'default')

[root@sta tmp]# python test.py

>

对比以上两个示例,getattr 会先查找该类的属性,如果没有相关的属性,然后再去查找是否有相关的方法,如果有则执行没有则报 AttributeError 错误。

In [7]: class demo(object):

...: name = 'feiyu'

...: def __getattr__(self, name):

...: print name, 'in getattr'

...:

In [9]: a = demo()

In [10]: a.name

Out[10]: 'feiyu'

In [11]: a.age

age in getattr

当 getattr 方法显示定义在类中时,执行类的某些属性和方法找不到时,会调用此方法。

总结:getattr 多用于将类的某些方法作为字符串当做参数进行传递,然后使用 getattr 获取其返回结果。

DevOps-田飞雨 》》转载请注明源地址

喜欢 (1)or分享 (0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值