Python功能之反射
生活随笔
收集整理的這篇文章主要介紹了
Python功能之反射
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
有如下文件:
index.py
| 1 | <span style="font-family:'宋體', SimSun;">#!/usr/bin/env?python<br data-filtered="filtered">#?-*-?coding:utf-8?-*-<br data-filtered="filtered">__author__?=?'ryan'<br data-filtered="filtered">"""<br data-filtered="filtered">import?home<br data-filtered="filtered">print?'oldboy....'<br data-filtered="filtered">url=raw_input('url:')<br data-filtered="filtered">if?url?==?'home/dev':<br data-filtered="filtered">????ret?=?home.dev()<br data-filtered="filtered">????print?ret<br data-filtered="filtered">if?url?=='/home/index':<br data-filtered="filtered">????ret?=?home.index()<br data-filtered="filtered">????print?ret<br data-filtered="filtered">if?url?=='/home/user':<br data-filtered="filtered">????ret?=?home.user<br data-filtered="filtered">????print?ret<br data-filtered="filtered">if?url?==?'/home/passwd':<br data-filtered="filtered">????ret?=?home.passwd<br data-filtered="filtered">????print?ret<br data-filtered="filtered">else:<br data-filtered="filtered">????print?'404'<br data-filtered="filtered">"""<br data-filtered="filtered">#getattr、setattr、delattr、?hasattr<br data-filtered="filtered">#找到home文件,將內(nèi)容加載到內(nèi)存,然后getattr、setattr、delattr、?hasattr?對(duì)home中斷函數(shù)進(jìn)行操作<br data-filtered="filtered">#由于函數(shù)在沒有執(zhí)行之前,只是將函數(shù)名放入內(nèi)存<br data-filtered="filtered">import?home<br data-filtered="filtered">#print?dir(home)<br data-filtered="filtered">#print?hasattr(home,'dev')#通過函數(shù)hasattr到內(nèi)存中找到home模塊,判斷home模塊下是否存在dev函數(shù),有返回True,否則返回false<br data-filtered="filtered">#print?dir(home)<br data-filtered="filtered">#print?getattr(home,'dev')#到內(nèi)存中的home模塊中去獲取函數(shù)dev(其實(shí)時(shí)獲取dev函數(shù)在內(nèi)存中的地址)<br data-filtered="filtered">#print?setattr(home,'alex','gentle?man')#通過setattr對(duì)內(nèi)存中的home模塊添加一個(gè)字符串a(chǎn)lex<br data-filtered="filtered">#print?dir(home)<br data-filtered="filtered">#delattr(home,'dev')#通過delattr刪除內(nèi)存中home模塊中的dev函數(shù)<br data-filtered="filtered">#print?dir(home)<br data-filtered="filtered">#<br data-filtered="filtered">"""<br data-filtered="filtered">class?Foo:<br data-filtered="filtered">????static_name='nba'<br data-filtered="filtered">????def?__init__(self):<br data-filtered="filtered">????????self.name='alex'<br data-filtered="filtered">????def?show(self):<br data-filtered="filtered">????????pass<br data-filtered="filtered">????@staticmethod<br data-filtered="filtered">????def?static_show(self):<br data-filtered="filtered">????????pass<br data-filtered="filtered">????@classmethod<br data-filtered="filtered">????def?class_show(cls):<br data-filtered="filtered">????????pass<br data-filtered="filtered">#obj=Foo()<br data-filtered="filtered">#print?Foo.__dict__.keys()?#查看類里面的成員<br data-filtered="filtered">#print?hasattr(Foo,'static_show')<br data-filtered="filtered">#print?obj.__dict__#查看對(duì)象里有哪些成員<br data-filtered="filtered">#print?hasattr(obj,'name')<br data-filtered="filtered">#print?hasattr(obj,'show')#普通方法是存儲(chǔ)在類里,但是這里用hasattr函數(shù)在對(duì)象obj中查找是否存在show方法,返回了Ture,原因是在對(duì)象obj中沒有找到之后會(huì)通過對(duì)象指針到創(chuàng)建對(duì)象的類中進(jìn)一步查找,所以這里返回True<br data-filtered="filtered">"""<br data-filtered="filtered">"""<br data-filtered="filtered">print?hasattr(Foo,'__init__')<br data-filtered="filtered">print?"##########分隔符①################"<br data-filtered="filtered">print?hasattr(Foo,'static_name')<br data-filtered="filtered">print?"##########分隔符②################"<br data-filtered="filtered">print?hasattr(Foo,'show')<br data-filtered="filtered">print?"##########分隔符③################"<br data-filtered="filtered">print?hasattr(Foo,'static_show')<br data-filtered="filtered">print?"##########分隔符④################"<br data-filtered="filtered">print?hasattr(Foo,'class_show')<br data-filtered="filtered">obj=Foo()<br data-filtered="filtered">print?obj.__dict__<br data-filtered="filtered">print?hasattr(obj,'show')<br data-filtered="filtered">print?hasattr(obj,'__init__')<br data-filtered="filtered">print?"##########分隔符①################"<br data-filtered="filtered">print?hasattr(obj,'static_name')<br data-filtered="filtered">print?"##########分隔符②################"<br data-filtered="filtered">print?hasattr(obj,'show')<br data-filtered="filtered">print?"##########分隔符③################"<br data-filtered="filtered">print?hasattr(obj,'static_show')<br data-filtered="filtered">print?"##########分隔符④################"<br data-filtered="filtered">print?hasattr(obj,'class_show')<br data-filtered="filtered">"""<br data-filtered="filtered">"""<br data-filtered="filtered">import?home<br data-filtered="filtered">cls?=?getattr(home,"Foo")<br data-filtered="filtered">print?cls<br data-filtered="filtered">s_name?=?getattr(cls,'static_name')<br data-filtered="filtered">print?s_name<br data-filtered="filtered">c_show?=?getattr(cls,'show')<br data-filtered="filtered">print?c_show<br data-filtered="filtered">s_show=getattr(cls,'static_show')<br data-filtered="filtered">print?s_show<br data-filtered="filtered">cla_show?=?getattr(cls,'class_show')<br data-filtered="filtered">print?cla_show<br data-filtered="filtered">"""<br data-filtered="filtered">import?home<br data-filtered="filtered">cls?=?getattr(cls,'Foo')<br data-filtered="filtered">obj=cls()#實(shí)例化一個(gè)對(duì)象obj<br data-filtered="filtered">name?=?getattr(obj,'name')<br data-filtered="filtered">print?name<br data-filtered="filtered"></span> |
home.py
| 1 | <span style="font-family:'宋體', SimSun;">#!/usr/bin/env?python<br>#?-*-?coding:utf-8?-*-<br>__author__?=?'ryan'<br>def?index():<br>????return?'result?home.index'<br>def?dev():<br>????return?'result?home.dev'<br>def?user():<br>????return?'result?home.user'<br>def?passwd():<br>????return?'result?home.passwd'<br>"""<br>class?Foo:<br>????static_name='nba'<br>????def?__init__(self):<br>????????self.name='alex'<br>????def?show(self):<br>????????pass<br>????@staticmethod<br>????def?static_show(self):<br>????????pass<br>????@classmethod<br>????def?class_show(cls):<br>????????pass<br>"""<br></span> |
反射
fanshe.py
| 1 | <span style="font-family:'宋體', SimSun;">#!/usr/bin/env?python<br>#?-*-?coding:utf-8?-*-<br>__author__?=?'ryan'<br>url?=?raw_input('url:')<br>controller,action?=url.split('/')<br>import?home<br>#action動(dòng)作是一個(gè)字符串,去某個(gè)容器(模塊)中去找函數(shù),字符串即為函數(shù)名,如果有則獲取函數(shù)<br>func?=getattr(home,action)<br>func?=?dev?dev1():<br>?????return?'result?home.dev'<br>?????ret?=?func()<br>#func=getattr(home,'index')<br>ret=func()<br>print?ret<br></span> |
webdemo.py
| 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 | #!/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模塊中檢查,是否含有指定的函數(shù) ????is_exist?=?hasattr(home,?temp) ????#如果存在指定的函數(shù) ????if?is_exist: ????????#獲取函數(shù) ????????func?=?getattr(home,?temp) ????????#執(zhí)行函數(shù)并獲取返回值 ????????ret?=?func() ????????#將函數(shù)返回值響應(yīng)響應(yīng)給請(qǐng)求者,即瀏覽器 ????????return?ret ????else: ????????#如果不存在函數(shù)則返回給瀏覽器'404?not?found' ????????return?'404?not?found' if?__name__?==?'__main__': ????httpd?=?make_server('',?8001,?RunServer) ????print?"Serving?HTTP?on?port?8001..." ????httpd.serve_forever() |
? ? ? 本文轉(zhuǎn)自027ryan ?51CTO博客,原文鏈接:http://blog.51cto.com/ucode/1763328,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的Python功能之反射的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器引导顺序,docker compo
- 下一篇: 发明个人计算机哪国人,电脑是哪国人发明的