所谓的反射就是这四个函数:
hasattr(p_object, name)
这个函数是一个布尔型,他的目的就是为了决定一个对象是否有一个特定的属性,一般用于访问某个属性前先做一下检查
getattr(object, name, default=None)
获取对象的属性,如果输方法就返回这个方法对应的地址,试图获取不存在的属性的时候会引发一个AttributeError异常
setattr(p_object, name, value)
给对象的属性进行赋值,可以设置一个方法,要么加入一个新属性,要么覆盖已经存在的属性
delattr(p_object, name)
从一个对象中删除属性
实现
#coding:utf-8
import sys
class Webserver(object):
def __init__(self,host,port):
self.host=host
self.port=port
def start(self):
print "server is starting....",self.host
def stop(self):
print "server is stopping.....",self.host
def restart(self):
self.start()
self.stop()
def run(name):
print "testing ....",name
def runt(obj,name):
print obj.host+'...testing...'+name
if __name__ == '__main__':
execute=sys.argv #获取用户键入的参数
server=Webserver('localhost',8080)
server2=Webserver('127.0.0.1',80)
现在我们就来看看用户通过键入参数想要使用类中的方法有几种代码实现
一般版本
#
if execute[1]=='start':
server.start()
if execute[1] == 'stop':
server.stop()
if execute[1]=='restart':
server.restart()
进阶版本
#
exe={'start':server.start,'stop':server.stop,'restart':server.restart}
if execute[1] in exe:
exe[execute[1]]()
最终版本
hasattr(p_object, name)
getattr(object, name, default=None)
if hasattr(server,execute[1]): #判断server是否还有用户键入的方法
func=getattr(server,execute[1]) #获取实例方法的地址
func() #调用这个方法
setattr(p_object, name, value)
设置属性
setattr(server,'test',run) #将run()函数转变成实例server中的test()方法
#执行这个方法
server.test('cmustard') #testing .... cmustard
#进阶版属性,如何让转化后的函数可以使用类属性,比如说实例中的host属性
setattr(server,'testt',runt)
#只需要将实例显式的传递给函数
server.testt(server,'cmustard')
"localhost...testing...cmustard"
server2.testt(server2,'cmustard')
"'Webserver' object has no attribute 'testt' "
"由于这个函数只是传递给了实例server,因此其他实例是无法使用的"
delattr(p_object, name)
删除属性
#删除实例server中的host属性
delattr(server,'host')
print server.host
"Webserver' object has no attribute 'host'"
#如果想要删除方法,
delattr(server,'start') #AttributeError: start
#以上这种是不可行的,因为方法数类属性,并不是实例属性
#解决方法
delattr(Webserver,'start')
server.start() #'Webserver' object has no attribute 'start' 删除成功