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)