Python反射
- 通过字符串映射或修改程序运行时的状态、属性、方法。
- 通常用于框架或库的开发。
反射的4个方法
hasattr (常用) 判断对象(属性或方法)是否存,返回布尔值
getattr (常用) 获取对象(属性或方法),返回对象方法的内存地址
setattr 设置对象(属性或方法)
delattr 删除对象(属性或方法)
# hasattr(object, name)
判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False。
class Dog(object):
def __init__(self, name):
self.name = name
def eat(self):
print("%s is eating..." % self.name)
obj = Dog("alex")
print(hasattr(obj, "name"))
print(hasattr(obj, "eat"))
>>>
True
True
# getattr(object, name[,default])
获取对象object的属性或者方法,如果存在打印出来,如果不存在,打印出默认值,默认值可选。
需要注意的是,如果是返回的对象的方法,返回的是方法的内存地址,如果需要运行这个方法,可以在后面添加一对括号。
class Dog(object):
def __init__(self, name):
self.name = name
def eat(self):
print("%s is eating..." % self.name)
obj = Dog("alex")
print(getattr(obj, "name"))
print(getattr(obj, "age", 38)) #若属性不存在,则返回一个默认值
getattr(obj, "eat")()
>>>
alex
38
alex is eating...
# setarrt(obj, y, v)
将函数装配到obj类中成为类方法。
def setattr(x, y, v): # real signature unknown; restored from __doc__ """ Sets the named attribute on the given object to the specified value. setattr(x, 'y', v) is equivalent to ``x.y = v'' """ pass -------------------------------------------------------- class Dog(object): def __init__(self, name): self.name = name def eat(self): print("%s is eating..." % self.name) obj = Dog("alex") getattr(obj, "age", setattr(obj, "age", 38)) # 若getarrt无法获取“age”, 就使用setattr创建"age" print(obj.age) >>> 38