反射是个啥:通过一个URL,按照一定的格式切割这个URL,并获得相应的切割字符串,通过这个字符串去后台匹配方法并返回给前端的一种方式。举个例子:
#!/usr/bin/env python #coding:utf-8 def index(): return 'index' def dev(): return 'dev'
#!/usr/bin/env python #coding:utf-8 import home controller,action = raw_input('url:').split('/') module = __import__(controller) if hasattr(module,action): func = getattr(module,action) ret = func() print ret else: print '不存在对应的方法: %s ' % (action)
home.py与index.py文件。
__import__:单纯是一个导入作用,将home字符串作为模块导入,前提是你的当期的路径下存在该模块。
将模块与成员方法用字符串导入,并执行对应方法。
这个例子用到了hasattr,getattr两个方法,python的反射中还有两个方法,接下来就介绍下:
class Foo(object): def __init__(self): self.name = 'name' def func(self): return 'func' obj = Foo() # #### 检查是否含有成员 #### hasattr(obj, 'name') hasattr(obj, 'func') # #### 获取成员 #### getattr(obj, 'name') getattr(obj, 'func') # #### 设置成员 #### setattr(obj, 'age', 18) setattr(obj, 'show', lambda num: num + 1) # #### 删除成员 #### delattr(obj, 'name') delattr(obj, 'func')
hasattr,getattr,setattr,delattr,我经常用到的4中方法。应该已经很清楚了,不需要再解释了。
这里再说下通过反射的方式去获得类的对象的属性。
一般获取对象属性如下:
class Foo(object): def __init__(self): self.name = 'name' def func(self): return 'func' obj = Foo() # 访问字段 obj.name # 执行方法 obj.func()
其他方式获取obj对象中的name变量指向内存中的值 “name”:
class Foo(object): def __init__(self): self.name = 'name' def func(self): return 'func' # 不允许使用 obj.name obj = Foo() #一种方式通过:对象成员里面去获取‘name’ print obj.__dict__['name']
class Foo(object): def __init__(self): self.name = 'alex' def func(self): return 'func' # 不允许使用 obj.name obj = Foo() #通过反射的方式去获取这个对象的属性 print getattr(obj, 'name')
最后结合一个实际小demo的web的例子去感受下反射:
#!/usr/bin/env python #coding:utf-8 import wsgiref 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('127.0.0.1', 8001, RunServer) print "Serving HTTP on port 8000..." httpd.serve_forever()