反射
反射
什么是反射?
- 本质上就是通过字符串对对象进行操作
常用:
- 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