「反射」 Python中的神器

1.什么是反射:
通过字符串映射object对象的方法或者属性
2.反射的方法
hasattr(obj,name_str): 判断objec是否有name_str这个方法或者属性
getattr(obj,name_str): 获取object对象中与name_str同名的方法或者函数
setattr(obj,name_str,value): 为object对象设置一个以name_str为名的value方法或者属性
delattr(obj,name_str): 删除object对象中的name_str方法或者属性
3.方法的简单介绍
getattr:

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

    def eat(self):
        print('%s 正在吃夜宵 ...'%self.name)

    def run(self):
        print('%s 正在跑步中 ...'%self.name)

#  场景: 当用户在操作时,面对用户不同的操作就需要调用不同的函数
#  如果用if,elif语句的话,会存在一个问题,当用户有500个不同的操作,
#  就需要写500次if,elif。这样就会出现代码重复率高,而且还不易维护
#  这时候反射就出现了,通过字符串映射对象或方法

# 实例化一个对象: 胖毛
c = User('胖毛')

# 用户输入指令
choose = input('>>>:')

# 通过hasattr判断属性/方法是否存在
if hasattr(c,choose):
    # 存在,用一个func接收
    func = getattr(c,choose)
    # 通过类型判断是属性还是方法
    if type(func) == str:
        print(func)
    else:
        func()
else:
    print('操作有误,请重新输入')

setatter:
    
#_author_='shaojie'
#-*- coding:utf-8 -*-

def sing(self):
    print("%s 正在唱歌中..."%self.name)

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

    def eat(self):
        print('%s 正在吃夜宵 ...'%self.name)

    def run(self):
        print('%s 正在跑步中 ...'%self.name)


choice = input('>>>:')
c = User('胖毛')

if hasattr(c, choice):
    func = getattr(c, choice)
    print(func)
else:
    # 装饰一个方法或者属性,这里装饰的是一个sing方法
    setattr(c, choice, sing)
    func = getattr(c,choice)
    func(c)
    
image
delattr:

#_author_='shaojie'
#-*- coding:utf-8 -*-

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

    def eat(self):
        print('%s 正在吃夜宵 ...'%self.name)

    def run(self):
        print('%s 正在跑步中 ...'%self.name)


choice = input('>>>:')
c = User('胖毛')

# 这里以删除name属性为例
print(c.name)
try:
    # 先判断属性是否存在,存在就删除
    if hasattr(c,choice):
        delattr(c,choice)
    else:
        pass
    print(c.name)
# 捕获没有属性抛出的异常
except AttributeError:
    print('删除%s成功'%choice)
「反射」 Python中的神器_第1张图片
image

4.反射的实际应用场景

在我们做接口自动化的时候,需要通过不同的请求方式,调用不同的函数

未使用反射之前

「反射」 Python中的神器_第2张图片
image
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/u/14140bf8f6c7"
method = input("请求方法>>>:")

h = Http()
if method.upper() == 'GET':
    result = h.get(url)
elif method.upper() == 'POST':
    result = h.post(url)
else:
    print('请求方式有误....')
print(result)

使用反射之后

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/u/14140bf8f6c7"
method = input("请求方法>>>:")
h = Http()

if hasattr(h,method):
    func = getattr(h,method)
    res = func(url)
    print(res)
else:
    print("你的请求方式有误...")

「反射」 Python中的神器_第3张图片
image

好了,今天到这了,该睡觉了,明天又是一条好汉。

「反射」 Python中的神器_第4张图片
image
单身狗睡不着吧,哈哈哈哈

你可能感兴趣的:(「反射」 Python中的神器)