python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。
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", 22) server1 = WebServer('localhost', 22) setattr(server, 'name', 'website') #设置实例,该实例就有了name属性 setattr(server, "run", test_run) #将类外面的函数与类实例绑定在一起 if hasattr(server, sys.argv[1]): #检测类里是否有这个方法,sys.argv[1]是指第一个参数就是命令后面跟的类似service start的start fun = getattr(server, sys.argv[1]) #获取实例方法的内存地址,即server.start fun() #执行方法 #server1.run('web1') #test_run与实例server绑定在一起,server1中是没有的,这里会报错 #删除start方法 delattr(WebServer, 'start') #注意这里删除的是类的方法,如果删除某实例中的方法,则其它实例中还可以执行 #server1.start() #start方法已经被删除,这里会报错 server.start() #删除之后所有的实例都不能执行start方法了
===========以下内容为转载=====================
#文/大明白(简书作者)
#原文链接:http://www.jianshu.com/p/b937f346dd4a
#著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
#Python中有一个有趣的语法,只要定义类型的时候,实现call函数,
#这个类型就成为可调用的。换句话说,我们可以把这个类的对象当作函数来使用,
#相当于重载了括号运算符。setattr, getattr, delattr为操作对象属性的调用
#Python中有一个有趣的语法,只要定义类型的时候,实现call函数, #这个类型就成为可调用的。换句话说,我们可以把这个类的对象当作函数来使用, #相当于重载了括号运算符。setattr, getattr, delattr为操作对象属性的调用 class storage(dict): #通过使用__setattr__, __getattr__, __delattr__ #可以重写dict,使之通过“.”调用 def __setattr__(self, key, value): self[key] = value def __getattr__(self, key): try: return self[key] except KeyError as k: return None def __delattr__(self, key): try: del self[key] except KeyError as k: return None # __call__方法用于实例自身的调用 #达到()调用的效果 def __call__(self, key): try: return self[key] except KeyError as k: return None s = storage() s.name = "hello" #这是__setattr__起的作用 print(s("name")) #这是__call__起的作用 print(s["name"]) #dict默认行为 print(s.name) #这是__getattr__起的作用 del s.name #这是__delattr__起的作用 #print(s("name")) #print(s["name"]) #print(s.name) #可以定义任意的key s.job = 'IT' s.age = 123 print(s.job, s.age)