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‘”错误!!!