本文和大家分享的主要是python
内建函数getattr()相关内容,一起来看看吧,希望对大家
学习python 有所帮助。
上述代码查看传送门
记录
getattr
是
python
里的一个内建函数
,
先看定义
>>> help(getattr)
Help
on built-
in
function getattr
in
module __builtin__:
getattr(...)
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.
>>>
getattr()
的三个参数:
· object :
要实例化的对象
· name
: 要执行的命令操作
· default :
(可省略参数)当要执行的命令操作不存在是,会返回这里传入的
default
getattr()
主要的作用是通过传入字符串的方式,来动态的获取方法的实例。这个函数最大的用处在于函数解耦,可以讲一些可能会调用的方法,写到一个配置文件中,在需要的时候动态加载。
解释的比较抽象,简单来说:
getattr(object, name)
等价于
object.name
下面通过代码说明一下
for i in range(t):
c, *
args =
map(str,input().
split())
getattr(s,
c) (*(
int(
x)
for
x in
args))
这段代码实现了用户从
stdin
输入命令和参数,命令赋值给了
c
,参数传给了一个指针变量
*args ,
这里使用
*args
是为了接收不确定个数的参数。然后调用
getattr(s,c)
来执行
c
这条指令(注:
s
是一串字符串),此处
getattr(s,c)
就可以等价于
s.c ,
后面括号内
(*(int(x) for x in args)) ,
这里是一个生成器表达式,这部分称为参数解包,它类似于如何定义具有任意数量(位置)参数的函数
—
*
在序列之前将遍历序列并将其成员变为函数调用参数。
可以看出,这样的用法比枚举的思路方便了很多,也具有更高的扩展性。
延伸
Python
中和
getattr
相关的还有
hasattr
、
setattr
、
delattr
,通过举例了解一下。
#
定义一个类对象
class
Vimiix:
def
__init__(self):
self.name = 'vimiix'
def
setName(self, name):
self.name = name
def
getName(self):
return self.name
#
实例化对象
foo = Vimiix()
hasattr(object, name) 判断object是否具有name属性
>>>hasattr(foo,'getName')
True
setattr(object,name,default) 设置一个新的属性,并赋予值.类似foo.age = 18
>>>setattr(foo, 'age', '18')
delattr(object, name) 删除object对象的name属性
>>>delattr(foo, 'age')>>>getattr(foo, 'age', 'Not find')
'Not find'
来源:Vimiix