「反射」 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)
image

4.反射的实际应用场景

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

未使用反射之前

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("你的请求方式有误...")

image

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

image
单身狗睡不着吧,哈哈哈哈

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,663评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,010评论 19 139
  • 朋友圈的新朋友,老朋友,大家好!我是来自美丽的海滨城市大连。我是付爱宝全国总代李楠。当几年前微信营销来临的时候,我...
    丫丫浩泽团队阅读 227评论 0 0
  • 她,一定是一个奇葩。下午以部门为单位的辩论赛2比3惜败,晚上她却连着看了三集奇葩说,一集讲异地恋的一集讲婚前性行为...
    KATE小奕阅读 1,686评论 10 1
  • 3.16《自在独行》 【day4盈盈】 贾老先生说,朋友是磁石吸来的贴片儿,钉子,螺丝帽和小别针,只要愿意,从俗世...
    苏小盈阅读 83评论 0 0