反射

 

反射

什么是反射?

  • 本质上就是通过字符串对对象进行操作

常用:

  • hasattr(object, name)
    • 判断name是否是object的属性,返回一个布尔值。
    • name必须是字符串,object可以是任何有方法的对象,包括:类、类的实例、模块。
  • getattr(object, name[, default])
    • 调用object的name属性或者方法,失败时返回default
    • 通常和hasattr方法连用
      class Foo:
          f = '类的静态字段'
    	
          def __init__(self, name):
              self.name = name
              self.common = '类的普通字段'
    	
          def say_hi(self):
              print('hi, %s' % self.name)
    	
      obj = Foo('jack')
    	
      # 判断是否含有某属性
      print(hasattr(Foo, 'f'))
      print(hasattr(obj, 'name'))
      print(hasattr(obj, 'say_hi'))
    	
      # 获取属性
      print(getattr(Foo, 'f'))
      print(getattr(obj, 'name'))
      getattr(obj, 'say_hi')()
    	
      print(getattr(obj, 'empty', "Does't exist."))
    
  • 关于模块

      import sys
      if hasattr(sys.modules[__name__], 'Foo'):
          getattr(getattr(sys.modules[__name__], 'Foo')('jack'), 'say_hi')()
    
  • 通过sys.moudules得到当前已加载的模块列表,使用__name__获取本文件的对象,判断是否有Foo属性,如果有则调用Foo属性并实例化出一个对象,调用对象的say_hi方法。

不常用:

  • setattr(object, name, value)
    • getattr的一个变种,可以对object的name属性进行赋值操作
      setattr(obj, 'name', 'other')
      print(getattr(obj, 'name'))
    
    • 如果name属性不存在则会为其创建一个值为value的name属性
    • value可以是函数,包括另外定义的函数或者匿名函数,但是调用的时候必须要额外进行赋值操作
  • delattr(object, name)
    • 用于删除object的name属性,如不存在属性则报AttributeError
posted @ 2018-06-18 10:48  感动#心  阅读(133)  评论(0编辑  收藏  举报