反射

python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class  Foo( object ):
 
     def  __init__( self ):
         self .name  =  'wupeiqi'
 
     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' )

 
#!/usr/bin/env python
#_*_ conding:utf-8 _*_
import home
#检查是否有成员page1
print hasattr(home,'page1')

#获取page1成员
print getattr(home,'page1')

#设置成员page100
setattr(home,'page100',lambda x:x+1)
print dir(home)

#删除成员page1
delattr(home,'page1')
print dir(home)
普通方法:
反射_第1张图片 反射_第2张图片
反射_第3张图片

通过反射:
getattr方法可以查找home模块是否有b函数
反射_第4张图片

动态模块导入
#!/usr/bin/env python
#encoding: utf-8
url = raw_input('url:')
a,b = url.split('/')
module = __import__(a)
#动态模块导入,根据用户输入字符串来导入模块
func = getattr(module,b)
ret = func()
print ret
 
 
WEB框架1
#!/usr/bin/env python
#_*_ conding:utf-8 _*_
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]
    #对web url进行split : http://localhost:8001/page1, 取下标为1的元素page1
import home
    is_exist = hasattr(home, temp)
    #hasatrr去home模块中检查,是否含有指定的函数temp
if is_exist:                    #如果存在
func = getattr(home, temp)  #getattr获取函数temp
ret = func()                #执行函数获取返回值
return ret
    else:                           #如果不存在,则返回404
return '404 not found'

if __name__ == '__main__':
    httpd = make_server('', 8001, RunServer)
    print "Serving HTTP on port 8001..."
httpd.serve_forever()

  


WEB框架2
#!/usr/bin/env python
#encoding: utf-8
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']

    file_name = url.split('/')[1]   #获取模块名  #http://localhsot:8001/home/page1
func_name = url.split('/')[2]   #获取方法名  #page1
module = __import__(file_name)  #导入home模块
is_exist = hasattr(module, func_name)   
    if is_exist:
        func = getattr(module, func_name)   #执行home模块中的page1方法
ret = func()
        return ret
    else:
        return '404 not found'

if __name__ == '__main__':
    httpd = make_server('', 8001, RunServer)
    print "Serving HTTP on port 8001..."
httpd.serve_forever()

  


 
操作类和对象中的成员
#!/usr/bin/env python
#encoding: utf-8
class Foo:
    static_name = 'china'
def __init__(self):
        self.name = 'yangmv'
def show(self):
        pass
@staticmethod
def static_show():
        pass
@classmethod
def class_show(cls):
        pass


obj = Foo()
print obj.__dict__.keys()       #查看类中所有字段
print hasattr(obj,'name')       #查找是否有name字段
print hasattr(obj,'static_name')
print hasattr(obj,'show')

  


 
 

 



 

你可能感兴趣的:(反射)