为什么需要用反射?
在程序开发中,我们常常会遇到这样的需求:需要执行对象里某个方法,或需要调用对象中的某个变量,但是由于种种原因我们无法确定这个方法或变量是否存在,这时我们需要用一个特殊的方法或机制来访问和操作这个未知的方法或变量,这种机制就称为反射机制。接下来记录下反射的几个重要的方法:
getattr(获取成员)、hasattr(检查成员)、setattr(设置成员)、delattr(删除成员)
getattr
语法:getattr(obj, ‘属性或者方法’, ‘默认参数’)
作用:获取某对象的属性或方法内存地址, 假如找不到就返回默认参数
class Foo(object):
def __init__(self, name):
self.name = name
def get_ok(self):
return "ok"
foo = Foo("kermit")
# t_f = getattr(foo, 'name') # 获取的是一个属性# print(t_f)
t_f = getattr(foo, 'get_ok') # 获取的是一个对象
print(t_f())
hasattr
语法:getattr(obj, 属性或者方法)
作用:判断属性或者方法是否存在
class Hasattr(object):
def __init__(self, age):
self.age = age
def true(self):
return "true"
has = Hasattr(18)
# t_f = hasattr(has, 'age') # True
# t_f = hasattr(has, 'true') # True
t_f = hasattr(has, 'xxx') # False
print(t_f)
setattr
语法:setattr(obj, 实例对象属性或者方法, 设置的内容)
作用:给原有的属性或者方法添加新的内容
class Setattr(object):
def __init__(self, name, age):
self.name = name
self.age = age
def say_ok(self):
return "ok"
def say_ko(self):
return "ko"
sets = Setattr('kermit', 18)
# setattr(sets, "name", "kk") # kermit 变成 kk了
# print(sets.name)
setattr(sets, "say_ok", "ko") # 把say_ok函数的返回值改为ko
print(sets.say_ok) # 返回ko
delattr
语法:delattr(obj, 属性或者方法)
作用:删除对象中的变量;注意:不能删除方法
class Delattr(object):
def __init__(self,name):
self.name = name
def delete(self):
return "delete"
delete = Delattr("kermit")
delattr(delete, "name") # 删除name变量
print(delete.name) # 此时将报错