Python之类反射
python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,该四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。
class Foo(object):
def __init__(self):
self.name = 'hongsong'
self.age = 24
def func(self):
return 'haha'
obj = Foo()
# #### 检查是否含有成员 ####
print(hasattr(obj, 'name'))
print(hasattr(obj, 'func'))
# #### 获取成员 ####
print(getattr(obj, 'name'))
r = getattr(obj, 'func')
print(r)
print(r())
# #### 设置成员 ####
setattr(obj, 'age', 18)
v = getattr(obj,'age')
print(v)
# #### 删除成员 ####
#delattr(obj, 'name')
#delattr(obj, 'func')
输出:
True
True
hongsong
<bound method Foo.func of <__main__.Foo object at 0x0000028570883A20>>
haha
18
当我们要访问一个对象的成员时,应该是这样操作:
class Foo(object):
def __init__(self):
self.name = 'yy
def func(self):
return 'func'
obj = Foo()
# 访问字段
obj.name
# 执行方法
obj.func()
a、上述访问对象成员的 name 和 func 是什么?
答:是变量名
b、obj.xxx 是什么意思?
答:obj.xxx 表示去obj中或类中寻找变量名 xxx,并获取对应内存地址中的内容。
使用其他方式获取obj对象中的name变量指向内存中的值 “yy”
方式一:
class Foo(object):
def __init__(self):
self.name = 'yy'
def func(self):
return 'func'
obj = Foo()
print(obj.__dict__['name'])#输出yy
方式二:
class Foo(object):
def __init__(self):
self.name = 'yy'
def func(self):
return 'func'
obj = Foo()
print(getattr(obj, 'name'))#输出yy
结论:反射是通过字符串的形式操作对象相关的成员。一切事物都是对象!!!—》类也是对象、模块也是对象