#coding:utf-8
'''
#反射的基本用法:
hasattr 判断一个方法是否存在于实例中
getattr 指定一个方法名字,获取该方法的内存地址,加"()"括号并可执行
'''
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__":
#sys.argv[1]表示:接收用户输入的第一个参数
#方法一:这种方法可以实现,但是很low(),不建议使用
# server = WebServer("127.0.0.1",3306)
# cmd_server = {"start":server.start,"stop":server.stop,"restart":server.restart}
# if sys.argv[1] in cmd_server:
# cmd_server[sys.argv[1]]()
# #方法二:但是这种方法有问题,怎么把用户输入的字符串名字调用对应的方法呢?
# cmd_server = sys.argv[1]
# if cmd_server in WebServer.__dict__:
# print(cmd_server)
# WebServer("127.0.0.1",3306).cmd_server #cmd_server为用户输入的字符串名字,但是这样调用显然不行
#方法三:利用hasattr和getattr方法判断方法是否存在对象中并获取对象中方法的内存地址
server = WebServer("127.0.0.1",3306)
if hasattr(server,sys.argv[1]): #hasattr;判断类中是否包含某一个方法和属性
func = getattr(server,sys.argv[1]) #getattr;获取server.start内存地址
func()'''
setattr绑定一个函数到实例
说明:如何把一个类之外的函数,绑定到实例里面呢?
'''
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 run_server(obj,name):
print("runing is %s"%obj.restart(),name)
if __name__ == "__main__":
server = WebServer("localhost",3306)
setattr(server,'run',run_server) #通过setattr方法把test_run函数绑定到server这个实例里,方法名是"run"
server.run(server,"apache")'''
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 run_server(name):
print("runing is %s",name)
if __name__ == "__main__":
server = WebServer("localhost",3306)
setattr(server,'run',run_server)
delattr(WebServer, "start") #删除类里面的方法
delattr(server, "host") #删除实例的属性
delattr(server,'run') #删除通过setattr添加到实例的属性
print(server.__dict__,WebServer.__dict__) #查看