【python】python反射(自省)

1、什么是反射(自省)?

  通过字符串映射object对象的方法或者属性

2、反射的方法:

  hasattr(obj, name_str):判断object是否有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、用法介绍:

  3.1 getattr

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

    def eat(self):
        print('%s is eating'%self.name)

    def run(self):
        print('%s is running'%self.name)

c = User('Tom')
while True:
    choose = input('>>>:')

    if hasattr(c, choose):
        func = getattr(c, choose)
        if type(func) == str:
            print(func)
        else:
            func()
        break
    else:
        print('操作有误,请重新输入')
View Code

  3.2 setattr

  
def sing(self):
    print("%s is singing"%self.name)

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

    def eat(self):
        print('%s is eating'%self.name)

    def run(self):
        print('%s is running'%self.name)

c = User('Tom')
while True:
    choose = input('>>>:')

    if hasattr(c, choose):
        func = getattr(c, choose)
        print(func)
        break
    else:
        #装饰一个方法或者属性,这里装饰的是sing方法
        setattr(c, choose, sing)
        func = getattr(c, choose)
        func(c)#!!!!!注意,因为定义的sing方法含参self,所以要把c对象传进去
        break
View Code

  3.3 delattr

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

    def eat(self):
        print('%s is eating'%self.name)

    def run(self):
        print('%s is running'%self.name)

c = User('Tom')

print(c.name)

choice = input('>>>:')

try:
    if hasattr(c,choice):
        delattr(c,choice)
    else:
        pass

    print(c.name)
except AttributeError:
    print('删除%s成功'%choice)
View Code

4、反射应用场景

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

  未使用反射之前

  
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)
View Code

  使用反射以后 

  
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("你的请求方式有误")
# if method.upper() == 'GET':
#     result = h.get(url)
# elif method.upper() == 'POST':
#     result = h.post(url)
# else:
#     print('请求方法有误')
View Code

  区别是啥呢?加入有100种请求方式,如果不用反射是不是很麻烦呢?

  其它:

  
class A:
    def __init__(self):
        self.name = 'zhangjing'
    def method(self):
        print('method print')

Inst = A()

print(getattr(Inst,'name','not find'))
print(getattr(Inst,'dsd','not find'))
print(getattr(Inst,'method','default'))
View Code
posted @ 2019-08-01 18:18  快乐happy园  阅读(98)  评论(0)    收藏  举报