所谓的反射就是这四个函数:
hasattr(p_object, name)
这个函数是一个布尔型,他的目的就是为了决定一个对象是否有一个特定的属性,通常用于访问某个属性前先作一下检查python
getattr(object, name, default=None)
获取对象的属性,若是输方法就返回这个方法对应的地址,试图获取不存在的属性的时候会引起一个AttributeError异常ruby
setattr(p_object, name, value)
给对象的属性进行赋值,能够设置一个方法,要么加入一个新属性,要么覆盖已经存在的属性markdown
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)
如今咱们就来看看用户经过键入参数想要使用类中的方法有几种代码实现spa
通常版本rest
#
if execute[1]=='start':
server.start()
if execute[1] == 'stop':
server.stop()
if execute[1]=='restart':
server.restart()
进阶版本code
#
exe={'start':server.start,'stop':server.stop,'restart':server.restart}
if execute[1] in exe:
exe[execute[1]]()
最终版本server
if hasattr(server,execute[1]): #判断server是否还有用户键入的方法
func=getattr(server,execute[1]) #获取实例方法的地址
func() #调用这个方法
设置属性对象
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,所以其余实例是没法使用的"
删除属性utf-8
#删除实例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' 删除成功