首页 » 编程 » Python » Python学习 » 面向对象 » 正文

反射

反射:通过字符串映射到对象的属性,也适用于类。

意思就是将字符串映射为属性来使用,比如通过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)

发表评论

*