Python功能之反射

  • 2020 年 1 月 14 日
  • 筆記

有如下文件:

index.py

#!/usr/bin/env python  # -*- coding:utf-8 -*-  __author__ = 'ryan'  """  import home  print 'oldboy....'  url=raw_input('url:')  if url == 'home/dev':      ret = home.dev()      print ret  if url =='/home/index':      ret = home.index()      print ret  if url =='/home/user':      ret = home.user      print ret  if url == '/home/passwd':      ret = home.passwd      print ret  else:      print '404'  """  #getattr、setattr、delattr、 hasattr  #找到home文件,將內容載入到記憶體,然後getattr、setattr、delattr、 hasattr 對home中斷函數進行操作  #由於函數在沒有執行之前,只是將函數名放入記憶體  import home  #print dir(home)  #print hasattr(home,'dev')#通過函數hasattr到記憶體中找到home模組,判斷home模組下是否存在dev函數,  #有返回True,否則返回false  #print dir(home)  #print getattr(home,'dev')#到記憶體中的home模組中去獲取函數dev(其實時獲取dev函數在記憶體中的地址)  #print setattr(home,'alex','gentle man')#通過setattr對記憶體中的home模組添加一個字元串alex  #print dir(home)  #delattr(home,'dev')#通過delattr刪除記憶體中home模組中的dev函數  #print dir(home)  #  """  class Foo:      static_name='nba'      def __init__(self):          self.name='alex'      def show(self):          pass      @staticmethod      def static_show(self):          pass      @classmethod      def class_show(cls):          pass  #obj=Foo()  #print Foo.__dict__.keys() #查看類裡面的成員  #print hasattr(Foo,'static_show')  #print obj.__dict__#查看對象里有哪些成員  #print hasattr(obj,'name')  #print hasattr(obj,'show')#普通方法是存儲在類里,  #但是這裡用hasattr函數在對象obj中查找是否存在show方法,  #返回了Ture,原因是在對象obj中沒有找到之後會通過對象指針到創建對象的類中進一步查找,  #所以這裡返回True  """  """  print hasattr(Foo,'__init__')  print "##########分隔符①################"  print hasattr(Foo,'static_name')  print "##########分隔符②################"  print hasattr(Foo,'show')  print "##########分隔符③################"  print hasattr(Foo,'static_show')  print "##########分隔符④################"  print hasattr(Foo,'class_show')  obj=Foo()  print obj.__dict__  print hasattr(obj,'show')  print hasattr(obj,'__init__')  print "##########分隔符①################"  print hasattr(obj,'static_name')  print "##########分隔符②################"  print hasattr(obj,'show')  print "##########分隔符③################"  print hasattr(obj,'static_show')  print "##########分隔符④################"  print hasattr(obj,'class_show')  """  """  import home  cls = getattr(home,"Foo")  print cls  s_name = getattr(cls,'static_name')  print s_name  c_show = getattr(cls,'show')  print c_show  s_show=getattr(cls,'static_show')  print s_show  cla_show = getattr(cls,'class_show')  print cla_show  """  import home  cls = getattr(cls,'Foo')  obj=cls()#實例化一個對象obj  name = getattr(obj,'name')  print name

home.py

#!/usr/bin/env python  # -*- coding:utf-8 -*-  __author__ = 'ryan'  def index():      return 'result home.index'  def dev():      return 'result home.dev'  def user():      return 'result home.user'  def passwd():      return 'result home.passwd'  """  class Foo:      static_name='nba'      def __init__(self):          self.name='alex'      def show(self):          pass      @staticmethod      def static_show(self):          pass      @classmethod      def class_show(cls):          pass  """

反射

fanshe.py

#!/usr/bin/env python  # -*- coding:utf-8 -*-  __author__ = 'ryan'  url = raw_input('url:')  controller,action =url.split('/')  import home  #action動作是一個字元串,去某個容器(模組)中去找函數,字元串即為函數名,  #如果有則獲取函數  func =getattr(home,action)  func = dev dev1():       return 'result home.dev'       ret = func()  #func=getattr(home,'index')  ret=func()  print ret

webdemo.py

#!/usr/bin/env python  #coding:utf-8  from wsgiref.simple_server import make_server  def RunServer(environ, start_response):      start_response('200 OK', [('Content-Type', 'text/html')])      url = environ['PATH_INFO']      temp = url.split('/')[1]      import home      #去home模組中檢查,是否含有指定的函數      is_exist = hasattr(home, temp)      #如果存在指定的函數      if is_exist:          #獲取函數          func = getattr(home, temp)          #執行函數並獲取返回值          ret = func()          #將函數返回值響應響應給請求者,即瀏覽器          return ret      else:          #如果不存在函數則返回給瀏覽器'404 not found'          return '404 not found'  if __name__ == '__main__':      httpd = make_server('', 8001, RunServer)      print "Serving HTTP on port 8001..."      httpd.serve_forever()