反射简单的理解:就是利用字符串的形式去对象
(模块)中操作(寻找/检查/删除/设置)(最简单理解就是通过字符串操作属性)接下来让我们记录下反射的几个方法:
hasattr
判断
对象中是否有这个方法或变量
class Dog(object):
def __init__(self, name):
self.name = name
def eat(self):
print("%s正在吃便便" % self.name)
dog = Dog('铁牛')
print hasattr(dog, 'name') # True 因为存在name这个变量
print hasattr(dog, 'eat') # True 因为存在eat这个方法
print hasattr(dog , 'play') # False 因为不存在play这个方法或者变量
getattr
获取
对象中的方法或变量的内存地址
class Dog(object):
def __init__(self, name):
self.name = name
def eat(self):
print("%s 正在吃便便" % self.name)
dog = Dog('铁牛')
get_dog = getattr(dog, 'name') # 获取name变量内存地址
print get_dog # 此时打印的是铁牛
eat_dog = getattr(dog, 'eat') # 获取eat方法的内存地址
eat_dog() # 此时打印的是 "铁牛正在吃便便"
print eat_dog # 此时打印的是 <bound method Dog.eat of <__main__.Dog object at 0x00000000037EE6A0>>
# 接下来我们看getattr有三个参数,那么第三个参数是什么呢 ?我们验证一下:
# getattr(o, name, default)
print getattr(dog, 'play', 'Not find') # 此时打印的是Not find 因为 dog对象中没有play这个的变量或者方法
setattr
- 给对象
添加
变量或方法
def drink(self):
print("%s 正在喝beer" % self.name)
class Dog(object):
def __init__(self, name):
self.name = name
dog = Dog('铁牛')
setattr(dog, 'eat', drink) # 将drink函数添加到对象dog中, 并且命名为eat
dog.eat(dog) # 调用eat方法, 因为这是额外添加的方法, 需手动传入对象
setattr(dog, 'age', 18) # 添加一个变量, 复制为18
print dog.age # 打印结果为:18
delattr
删除
对象中的变量。注意:不能用于删除方法
class Dog(object):
def __init__(self, name):
self.name = name
def eat(self):
print("%s 正在吃便便" % self.name)
dog = Dog('铁牛')
delattr(dog, 'name') # 此时删除name属性
print dog.name # 此时会报错:AttributeError: 'Dog' object has no attribute 'name' 因为delattr:将上面的"name"属性删除了
delattr(dog, 'eat') # AttributeError: eat 报错!!! 因为delattr 不能用于删除方法,只能删除属性