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 paramiko实现ssh远程访问的方法
Dec 03 Python
python实现巡检系统(solaris)示例
Apr 02 Python
Python多线程和队列操作实例
Jun 21 Python
matplotlib设置legend图例代码示例
Dec 19 Python
Python操作Oracle数据库的简单方法和封装类实例
May 07 Python
Pandas之DataFrame对象的列和索引之间的转化
Jun 25 Python
Python处理mysql特殊字符的问题
Mar 02 Python
Pycharm plot独立窗口显示的操作
Dec 11 Python
python 自动识别并连接串口的实现
Jan 19 Python
Python数据分析入门之教你怎么搭建环境
May 13 Python
写一个Python脚本下载哔哩哔哩舞蹈区的所有视频
May 31 Python
详解非极大值抑制算法之Python实现
Jun 28 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
PHP的substr_replace将指定两位置之间的字符替换为*号
2011/05/04 PHP
file_get_contents获取不到网页内容的解决方法
2013/03/07 PHP
php验证码的制作思路和实现方法
2015/11/12 PHP
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
jQuery 遍历json数组的实现代码
2020/09/22 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
Jquery封装tab自动切换效果的具体实现
2013/07/13 Javascript
JS实现滑动菜单效果代码(包括Tab,选项卡,横向等效果)
2015/09/24 Javascript
Angular.js中$apply()和$digest()的深入理解
2016/10/13 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
vue.js系列中的vue-fontawesome使用
2018/02/10 Javascript
JS表单传值和URL编码转换
2018/03/03 Javascript
nodejs基于express实现文件上传的方法
2018/03/19 NodeJs
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
vue .js绑定checkbox并获取、改变选中状态的实例
2018/08/24 Javascript
使用cx_freeze把python打包exe示例
2014/01/24 Python
Python实现定时精度可调节的定时器
2018/04/15 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
django美化后台django-suit的安装配置操作
2020/07/12 Python
Python实现像awk一样分割字符串
2020/09/15 Python
基于注解实现 SpringBoot 接口防刷的方法
2021/03/02 Python
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
携程旅行网:中国领先的在线旅行服务公司
2017/02/17 全球购物
世界上获奖最多的手机镜头:Olloclip
2018/03/03 全球购物
Michael Kors加拿大官网:购买设计师手袋、手表、鞋子、服装等
2019/03/16 全球购物
小学教师自我鉴定
2013/11/07 职场文书
大学生新闻专业个人自我评价
2013/11/12 职场文书
计算机应用与科学个人的自我评价
2013/11/15 职场文书
《灰椋鸟》教学反思
2014/04/27 职场文书
房地产开发项目建议书
2014/05/16 职场文书
客户答谢会致辞
2015/01/20 职场文书
销售内勤岗位职责范本
2015/04/13 职场文书
2016关于读书活动的心得体会
2016/01/14 职场文书
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers
redis sentinel监控高可用集群实现的配置步骤
2022/04/01 Redis