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