python如何通过实例方法名字调用方法


Posted in Python onMarch 21, 2018

本文实例为大家分享了python通过实例方法名字调用方法的具体代码,供大家参考,具体内容如下

案例:

       某项目中,我们的代码使用的2个不同库中的图形类:

              Circle,Triangle

       这两个类中都有一个获取面积的方法接口,但是接口的名字不一样

       需求:

              统一这些接口,不关心具体的接口,只要我调用统一的接口,对应的面积就会计算出来

如何解决这个问题?

定义一个统一的接口函数,通过反射:getattr进行接口调用

#!/usr/bin/python3
 
from math import pi
 
 
class Circle(object):
 def __init__(self, radius):
  self.radius = radius
 
 def getArea(self):
  return round(pow(self.radius, 2) * pi, 2)
 
 
class Rectangle(object):
 def __init__(self, width, height):
  self.width = width
  self.height = height
 
 def get_area(self):
  return self.width * self.height
 
 
# 定义统一接口
def func_area(obj):
 # 获取接口的字符串
 for get_func in ['get_area', 'getArea']:
  # 通过反射进行取方法
  func = getattr(obj, get_func, None)
  if func:
   return func()
  
 
if __name__ == '__main__':
 c1 = Circle(5.0)
 r1 = Rectangle(4.0, 5.0)
  
 # 通过map高阶函数,返回一个可迭代对象
 erea = map(func_area, [c1, r1])
 print(list(erea)) 

通过标准库operator中methodcaller方法进行调用

#!/usr/bin/python3
 
from math import pi
from operator import methodcaller
 
 
class Circle(object):
 def __init__(self, radius):
  self.radius = radius
 
 def getArea(self):
  return round(pow(self.radius, 2) * pi, 2)
 
 
class Rectangle(object):
 def __init__(self, width, height):
  self.width = width
  self.height = height
   
 def get_area(self):
  return self.width * self.height
 
if __name__ == '__main__':
 c1 = Circle(5.0)
 r1 = Rectangle(4.0, 5.0)
  
 # 第一个参数是函数字符串名字,后面是函数要求传入的参数,执行括号中传入对象
 erea_c1 = methodcaller('getArea')(c1)
 erea_r1 = methodcaller('get_area')(r1)
 print(erea_c1, erea_r1)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python+django快速实现文件上传
Oct 24 Python
python机器学习案例教程——K最近邻算法的实现
Dec 28 Python
python使用xpath中遇到:到底是什么?
Jan 04 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
May 07 Python
利用python修改json文件的value方法
Dec 31 Python
Python标准库使用OrderedDict类的实例讲解
Feb 14 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
May 07 Python
Python实现socket非阻塞通讯功能示例
Nov 06 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
Mar 19 Python
Python爬虫实现百度翻译功能过程详解
May 29 Python
解决Python import .pyd 可能遇到路径的问题
Mar 04 Python
Python利用FlashText算法实现替换字符串
Mar 31 Python
python如何为被装饰的函数保留元数据
Mar 21 #Python
15行Python代码带你轻松理解令牌桶算法
Mar 21 #Python
Python反转序列的方法实例分析
Mar 21 #Python
Python常见工厂函数用法示例
Mar 21 #Python
python如何统计序列中元素
Jul 31 #Python
python如何读写json数据
Mar 21 #Python
python如何读写csv数据
Mar 21 #Python
You might like
为什么夜间收到的中波电台比白天多
2021/03/01 无线电
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
PHP常见的序列化与反序列化操作实例分析
2019/10/28 PHP
鼠标经过的文本框textbox变色
2009/05/21 Javascript
jquery 列表双向选择器之改进版
2013/08/09 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
2014/03/28 Javascript
总结JavaScript的正则与其他语言的不同之处
2016/08/25 Javascript
Angular工具方法学习
2016/12/26 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
使用JS编写的随机抽取号码的小程序
2017/08/11 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
详解在React里使用"Vuex"
2018/04/02 Javascript
webpack中如何加载静态文件的方法步骤
2019/05/18 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
js回溯法计算最佳旅行线路代码实例
2019/09/11 Javascript
Swiper实现导航栏滚动效果
2020/10/16 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
[03:11]不朽宝藏三外观展示
2020/09/18 DOTA
python快速排序代码实例
2013/11/21 Python
举例讲解Python中的迭代器、生成器与列表解析用法
2016/03/20 Python
解决python3中自定义wsgi函数,make_server函数报错的问题
2017/11/21 Python
python清理子进程机制剖析
2017/11/23 Python
神经网络理论基础及Python实现详解
2017/12/15 Python
django中send_mail功能实现详解
2018/02/06 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
pytz格式化北京时间多出6分钟问题的解决方法
2019/06/21 Python
django 中的聚合函数,分组函数,F 查询,Q查询
2019/07/25 Python
PYTHON绘制雷达图代码实例
2019/10/15 Python
Python全局锁中如何合理运用多线程(多进程)
2019/11/06 Python
wxPython实现文本框基础组件
2019/11/18 Python
html5手机端页面可以向右滑动导致样式受影响的问题
2018/06/20 HTML / CSS
Guess美国官网:美国知名服装品牌
2019/04/08 全球购物
2014年协会工作总结
2014/11/22 职场文书
党支部先进事迹材料
2014/12/24 职场文书