python學習之反射
python學習反射
實例1
腳本內容如下:
#coding: utf8 class myClass(object): def fax(self): print ‘faxing....‘ def copy(self): print ‘copying...‘ def printing(): print ‘printing....‘ m = myClass() if hasattr(m,‘fax‘): #判斷myClass類中是否有fax方法 func = getattr(m,‘fax‘) #返回內存對象 func() #調用 setattr(m,‘print2‘,printing) m.print2() try: #delattr(m,‘copy‘) #print name #print dfdf #print tttt print m except AttributeError,e: print ‘something wrong..‘,e except Exception,e: print e finally: print ‘-----------‘ #else: # print "print nothing wrong ...." |
執行腳本結果如下:
faxing....
printing....
<__main__.myClass object at 0x028211D0>
-----------
實例2
腳本內容如下:
#/usr/bin/env python #coding: utf8 import sys class WebServer(object): def __init__(self,host,port): self.host = host self.port = port def start(self): print "Server is starting..." def stop(self): print "Server is stopping..." def restart(self): self.stop() self.start() if __name__ == "__main__": server = WebServer(‘localhost‘,80) #print sys.argv[1] cmd_dic = { ‘start‘:server.start, ‘stop‘:server.stop, ‘restart‘:server.restart, } #if sys.argv[1] == ‘start‘: if sys.argv[1] in cmd_dic: cmd_dic[sys.argv[1]]() |
執行腳本結果如下:
D:\Python學習\腳本學習>python 反射01.py start
Server is starting...
修改上面的腳本如下:
#/usr/bin/env python #coding: utf8 import sys class WebServer(object): def __init__(self,host,port): self.host = host self.port = port def start(self): print "Server is starting..." def stop(self): print "Server is stopping..." def restart(self): self.stop() self.start() if __name__ == "__main__": server = WebServer(‘localhost‘,80) if hasattr(server,sys.argv[1]): func = getattr(server,sys.argv[1]) ##獲取server.start的內存地址 func() ##相當於server.start() |
執行腳本結果如下:
D:\Python學習\腳本學習>python 反射02.py start
Server is starting...
D:\Python學習\腳本學習>python 反射02.py stop
Server is stopping...
修改上面的腳本如下:
#/usr/bin/env python #coding: utf8 import sys class WebServer(object): def __init__(self,host,port): self.host = host self.port = port def start(self): print "Server is starting..." def stop(self): print "Server is stopping..." def restart(self): self.stop() self.start() def test_run(name): print "running...",name if __name__ == "__main__": server = WebServer(‘localhost‘,80) if hasattr(server,sys.argv[1]): func = getattr(server,sys.argv[1]) ##獲取server.start的內存地址 func() ##相當於server.start() setattr(server,‘run‘,test_run) ##test_run以run身份綁定到server實例中 server.run(‘peng‘) ##類似執行test_run(‘peng‘) |
執行腳本結果如下:
D:\Python學習\腳本學習>python 反射03.py start
Server is starting...
running... peng
修改上面的腳本如下:
#/usr/bin/env python #coding: utf8 import sys class WebServer(object): def __init__(self,host,port): self.host = host self.port = port def start(self): print "Server is starting..." def stop(self): print "Server is stopping..." def restart(self): self.stop() self.start() def test_run(self,name): print "running...",name,self.host if __name__ == "__main__": server = WebServer(‘localhost‘,80) if hasattr(server,sys.argv[1]): func = getattr(server,sys.argv[1]) ##獲取server.start的內存地址 func() ##相當於server.start() setattr(server,‘run‘,test_run) ##test_run以run身份綁定到server實例中 server.run(server,‘peng‘) ##類似執行test_run(‘peng‘) |
執行腳本結果如下:
D:\Python學習\腳本學習>python 反射04.py start
Server is starting...
running... peng localhost
修改上面的腳本如下:
#/usr/bin/env python #coding: utf8 import sys class WebServer(object): def __init__(self,host,port): self.host = host self.port = port def start(self): print "Server is starting..." def stop(self): print "Server is stopping..." def restart(self): self.stop() self.start() def test_run(self,name): print "running...",name,self.host if __name__ == "__main__": server = WebServer(‘localhost‘,80) if hasattr(server,sys.argv[1]): func = getattr(server,sys.argv[1]) ##獲取server.start的內存地址 func() ##相當於server.start() delattr(WebServer,‘start‘) print server.restart() #setattr(server,‘run‘,test_run) ##test_run以run身份綁定到server實例中 #server.run(server,‘peng‘) ##類似執行test_run(‘peng‘) |
執行腳本結果如下:
D:\Python學習\腳本學習>python 反射05.py restart
Server is stopping... ---》執行的是func()的調用
Server is starting... ---》執行的是func()的調用
Server is stopping... ---》執行的是server.restart()的調用
Traceback (most recent call last):
File "反射05.py", line 31, in <module>
print server.restart()
File "反射05.py", line 19, in restart
self.start()
AttributeError: ‘WebServer‘ object has no attribute ‘start‘ ---》執行的是server.restart()的調用,此時start已經刪除,所以報了“‘WebServer‘ object has no attribute ‘start‘”錯誤!!!
本文出自 “一點點” 博客,請務必保留此出處http://pengai.blog.51cto.com/6326789/1933012
python學習之反射