美文网首页Python
「反射」 Python中的神器

「反射」 Python中的神器

作者: 少杰创业笔记 | 来源:发表于2018-03-25 00:19 被阅读0次
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 单身狗睡不着吧,哈哈哈哈

相关文章

  • 「反射」 Python中的神器

    1.什么是反射: 2.反射的方法 3.方法的简单介绍 4.反射的实际应用场景 在我们做接口自动化的时候,需要通过不...

  • python 中的反射

    反射中设计到两个内置函数 hasattr和getattrhasattr:用于判断对象是否包含对应的属性。getat...

  • 面向对象:反射,内置方法

    反射 python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使...

  • __import__ 反射和面向对象基础 self 封装 继承(

    一、反射 python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、del...

  • Python环境搭建 anaconda包管理

    简介 一键搭建python各种环境神器 anaconda 在使用python的过程中,经常因为python的版本和...

  • 扣丁学堂Python开发中反射和描述器详解

    今天扣丁学堂Python培训老师给大家介绍一下关于Python中反射和描述器的详细介绍,目前在Python中,能够...

  • Python中的reflect反射机制

    什么是反射? 这里我先说结论: Python 中的反射其实就是使用字符串调用函数或者方法。 这对于我们设计一些自动...

  • python反射

    我们可通过反射添加、修改、删除某个对象的属性和方法:hasattr(object,str):判断该对象是否含有该方...

  • Python 反射

    反射:本质是利用字符串的形式去对对象/模块进行操作其成员,一种基于字符串的时间驱动。以我现在的理解,就是本来需要显...

  • Python 反射

    概述 运行时,区别于编译时,指的是程序被加载到内存中执行的时候。反射,reflection,指的是运行时获取类型定...

网友评论

    本文标题:「反射」 Python中的神器

    本文链接:https://www.haomeiwen.com/subject/rmjccftx.html