Swift51.com
麦子学院 头像
麦子学院  2017-07-13 19:08

Python的内建函数getattr()如何使用?

回复:0  查看:2898  
本文和大家分享的主要是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( xfor  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