1. 程式人生 > >python學習之反射

python學習之反射

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學習之反射