python 面向对象中的反射:通过字符串的形式操作对象相关的属性。Python中的一切事物都是对象(都可以使用反射)
python中反射功能是由四个内置函数提供:hasattr, getattr, setattr, delattr
该四个函数分别用于对 对象内部执行:检查是否含有成员,获取成员,设置成员,删除成员。
class Foo(object):
def __init__(self):
self.name = 'tom'
def func(self):
return 'func123'
obj = Foo()
#-------检查是否含有成员
hasattr(obj,'name') #print ---> True
hasattr(obj,'func') #True
#-------获取成员
getattr(obj,'name')
getattr(obj,'func')
#-------设置成员
setattr(obj,'age',20)
setattr(obj,'show',lambda num:num + 1)
# print(obj.age) #20
# print(obj.show(2)) #3
#-------删除成员
delattr(obj,'name')
delattr(obj,'func')
# print(obj.name) #报属性错误
# print(obj.func()) #报属性错误
详细解析:
class Foo(object): role = '地球人' def __init__(self, name): self.name = name def func(self): return 'func123' obj = Foo('Tom') obj2 = Foo('jack') print(obj.name) print(obj2.name) print(obj.func())
解析开始:
class Foo(object):
def __init__(self):
self.name = '汤姆'
def func(self):
return 'func123'
obj = Foo()
#访问字段
obj.name
#执行方法
obj.func()
a.上述访问对象成员的 name 和 func 是什么?
答:是变量名
b. obj.xxx是什么意思?
答:obj.xxx 表示去obj中或类中寻找 变量名xxx, 并获取对应内存地址中的内容。
c.需求:使用其他方式获取obj对象中的name变量指向 内存中的值“汤姆”
***** 不允许使用 obj.name
答:两种方式
class Foo(object): def __init__(self): self.name = '汤姆' def func(self): return 'func123' obj = Foo() print(obj.__dict__['name'])
class Foo(object): def __init__(self): self.name = '汤姆' def func(self): return 'func123' obj = Foo() print(getattr(obj,'name'))
from wsgiref.simple_server import make_server class Handler(object): def index(self): return 'index' def news(self): return 'news' def RunServer(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) url = environ['PATH_INFO'] temp = url.split('/')[1] obj = Handler() is_exist = hasattr(obj, temp) if is_exist: func = getattr(obj, temp) ret = func() return ret else: return '404 not found' if __name__ == '__main__': httpd = make_server('', 8001, RunServer) print "Serving HTTP on port 8000..." httpd.serve_forever()
结论:反射是通过字符串的形式操作对象相关的成员。一切事物都是对象!!!
import sys def s1(): print('s1') def s2(): print('s2') this_module = sys.modules[__name__] print(hasattr(this_module,'s1')) #True print(hasattr(this_module,'s2')) #True
类也是对象
class Foo(object):
role = '地球人'
def __init__(self):
self.name = 'Tom'
def func(self):
return 'func'
@staticmethod
def bar():
return 'bar'
print(getattr(Foo,'role'))
print(getattr(Foo,'func'))
print(getattr(Foo,'bar'))
模块也是对象
home.py
def to_im():
return 'To be imported'
"""
程序目录:
home.py
index.py
当前文件:
index.py
"""
import home as obj
#print(obj.to_im())
func = getattr(obj,'to_im')
func()