优点
- 可消除if…else
Python 面向对象中的反射
- 通过字符串的形式操作对象的属性,true or false
- Python 中一切皆为对象,所以只要是对象都可以使用反射
- 比如:实例对象、类对象、本模块、其他模块,因为他们都能通过 对a.属性 的方式获取、调用
hasattr
def hasattr(*args, **kwargs):
pass
- 返回对象是否具有具有给定名称的属性
getattr
def getattr(object, name, default=None):
pass
- 获取对象指定名称的属性
- 当属性不存在,则返回 default 值,如果没有指定 default 就会抛出异常
未使用反射前
class BaseRequest:
req = requests.Session()
def get(self, url):
resp = self.req.get(url)
print("==get==")
return resp
def post(self, url):
resp = self.req.post(url)
print("==post==")
return resp
def put(self, url):
resp = self.req.put(url)
print("==put==")
return resp
# 不使用反射的方法
def main(self, method, url):
if method == "get":
self.get(url)
elif method == "post":
self.post(url)
elif method == "put":
self.put(url)
使用反射后
# 使用反射的方法
def main_attr(self, method, url):
if hasattr(self, method):
func = getattr(self, method)
func(url)
实际运用
# 原始
def get(self, url, **kwargs):
'''
定义get方法
'''
response = requests.get(self.host + url, **kwargs, timeout=self.timeout, verify=False)
return response
def post(self, url, **kwargs):
'''
定义post方法
'''
response = requests.post(self.host + url, **kwargs, timeout=self.timeout, verify=False)
return response
# 优化
def main_http(self, method, url, **kwargs):
# 判断对象是否有对应的方法
if hasattr(self, method):
# 获取对应的方法
func = getattr(self, method)
# 执行方法,且获取返回值
res = func(url, **kwargs)
return res
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/280602.html