24. 面向对象-反射

一、反射

​ python反射,核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动! python的四个重要内置函数:getattr、hasattr、delattr和setattr较为全面的实现了基于字符串的反射机制,并且它们都是对内存中的模块进行操作,不会修改源文件。

(1)hasattr(obj,name_str): 判断objec是否有name_str这个方法或者属性
(2)getattr(obj,name_str): 获取object对象中与name_str同名的方法或者函数 
(3)setattr(obj,name_str,value): 为object对象设置一个以name_str为名的value方法或者属性 
(4)delattr(obj,name_str): 删除object对象中的name_str方法或者属性

1、getattr()

class Routing(object):
    def __init__(self):
        pass

    def login(self):
        print("这是登录页面")

    def logout(self):
        print("这是退出页面")

    def home(self):
        print("这是主页面")

    def run(self):
        inputUser = input("请输入url:").strip()
        func = getattr(Routing(), inputUser)
        func()


if __name__ == "__main__":
    routing = Routing()
    routing.run()

> 请输入url:home
> 这是主页面

2、hasattr()

如果输入的url不存在,则报错。修改一下

class Routing(object):
    def __init__(self):
        pass

    def login(self):
        print("这是登录页面")

    def logout(self):
        print("这是退出页面")

    def home(self):
        print("这是主页面")

    def run(self):
        inputUser = input("请输入url:").strip()
        if hasattr(Routing(), inputUser):
            func = getattr(Routing(), inputUser)
            func()
        else:
            print("404")


if __name__ == "__main__":
    routing = Routing()
    routing.run()
    
>请输入url:www.baidu.com
>404

3、setattr()

def sing(self):
    print(f"{self.name}正在唱歌中")

class User:
    def __init__(self, name):
        self.name = name

    def eat(self):
        print(f"{self.name}正在吃宵夜")

    def run(self):
        print(f"{self.name}正在跑步中")

choice = input(">>>")
user = User("panda")

if hasattr(user, choice):
    func = getattr(user, choice)
    print(func)
else:
    # 装饰一个方法或属性,这里装饰的是一个sing方法
    setattr(user, choice, sing)
    func = getattr(user, choice)
    func(user)
    
> sing
> panda正在唱歌中

4、delattr()

class User:
    def __init__(self, name):
        self.name = name

    def eat(self):
        print(f"{self.name}正在吃宵夜")

    def run(self):
        print(f"{self.name}正在跑步中")


choice = input(">>>")
user = User("panda")

# 这里以删除name属性为例
print(user.name)

try:
    # 先判断属性是否存在,存在就删除
    if hasattr(user, choice):
        delattr(user, choice)
    else:
        pass
    print(user.name)
except AttributeError:
    print(f"删除{choice}成功")

>name
>panda
>删除name成功

5、反射应用场景

通过不同请求方式,调用不同函数

import requests

class Http(object):
    def get(self, url):
        res = requests.get(url)
        response = res.text
        return response

    def post(self, url):
        res = requests.post(url)
        response = res.text
        return response

# 使用反射后
url = "https://www.jianshu.com"
method = input("请求方式:")
http = Http()

if hasattr(http, method):
    func = getattr(http, method)
    res = func(url)
    print(res)
else:
    print("请求方式有误")
posted @ 2020-04-01 12:54  qi.hu  阅读(114)  评论(0编辑  收藏  举报