反射
反射:通过字符串映射到对象的属性,也适用于类。
意思就是将字符串映射为属性来使用,比如通过input输入一个字符串,把输入的字符串当作属性来使用,需要通过反射来实现。
反射主要用到:
hasattr:判断属性是否存在
getattr:获取属性值
setattr:修改属性值
delattr:删除属性值
来看下面的例子:
class People:
country = "China"
def __init__(self, name, age):
self.name = name
self.age = age
def talk(self):
print("%s is talking" % (self.name))
obj = People("alex", 19)
print(obj.name) # 本质为 obj.__dict__["name"]
print(obj.talk) # 本质为 obj.__dict__["talk"]
# hasattr 判断属性是否存在
print(hasattr(obj, "name")) # 判断name是否存在,本质为判断obj.__dict__["name"]
print(hasattr(obj, "talk")) # 判断talk是否存在,本质为判断obj.__dict__["talk"]
# getattr 获取属性值
print(getattr(obj, "name")) # name属性存在,正常输出这个属性的值
# print(getattr(obj,"xxxxx")) # xxxxx属性不存在,报错
print(getattr(obj, "xxxxx", None)) # 添加None参数,如果属性不存在,不报错,输出None ,存在则正常输出属性值
print(getattr(obj, "talk", None)) # 添加None参数,如果属性不存在,不报错,输出None ,存在则正常输出属性值
# setattr 设置属性
setattr(obj, "sex", "male") # 设置sex属性,值为male,本质为:obj.sex="male"
print(obj.sex) # 输出:male
# delattr 删除属性
delattr(obj, "age") # 本质为:del obj.age
print(obj.__dict__) # 查看已不存在age属性
# 也适用于类
print(getattr(People, "country"))
反射的应用:
class Service:
def run(self):
while True:
cmd = input(">>:")
if hasattr(self, cmd):
func = getattr(self, cmd)
func()
def get(self):
print("get......")
def put(self):
print("put......")
obj = Service()
obj.run()
运行示例输出:
>>:xxx
>>:get
get......
>>:put
put......
>>:
稍微改进下,接收更多参数:
class Service:
def run(self):
while True:
cmd = input(">>:")
cmds = cmd.split()
if hasattr(self, cmds[0]):
func = getattr(self, cmds[0])
func(cmds)
def get(self, cmds):
print("get......", cmds)
def put(self, cmds):
print("put......", cmds)
obj = Service()
obj.run()
运行示例输出:
>>:xxx
>>:get
get...... ['get']
>>:get a.txt
get...... ['get', 'a.txt']
>>:get a.txt b.txt
get...... ['get', 'a.txt', 'b.txt']
>>:put
put...... ['put']
>>:put a.txt
put...... ['put', 'a.txt']
>>:put a.txt b.txt
put...... ['put', 'a.txt', 'b.txt']
>>:
共有 0 条评论