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标准库与第三方库详解
Jul 22 Python
python脚本实现统计日志文件中的ip访问次数代码分享
Aug 06 Python
Python实现的简单文件传输服务器和客户端
Apr 08 Python
python使用socket连接远程服务器的方法
Apr 29 Python
Python手机号码归属地查询代码
May 04 Python
numpy.linspace 生成等差数组的方法
Jul 02 Python
Python爬虫框架Scrapy基本用法入门教程
Jul 26 Python
PyCharm安装Markdown插件的两种方法
Jun 24 Python
用Python获取摄像头并实时控制人脸的实现示例
Jul 11 Python
Python pandas实现excel工作表合并功能详解
Aug 29 Python
Django框架安装方法图文详解
Nov 04 Python
Pycharm操作Git及GitHub的步骤详解
Oct 27 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
smarty模板嵌套之include与fetch性能测试
2010/12/05 PHP
php之Memcache学习笔记
2013/06/17 PHP
file_get_contents("php://input", "r")实例介绍
2013/07/01 PHP
PHP中$this和$that指针使用实例
2015/01/06 PHP
PHP Redis扩展无法加载的问题解决方法
2019/08/22 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
Javascript图像处理—平滑处理实现原理
2012/12/28 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
js获得页面的高度和宽度的方法
2014/02/23 Javascript
浅谈JS闭包中的循环绑定处理程序
2014/11/09 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
Avalon中文长字符截取、关键字符隐藏、自定义过滤器
2016/05/18 Javascript
BootStrap的Datepicker控件使用心得分享
2016/05/25 Javascript
Bootstrap3 内联单选和多选框
2016/12/29 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
jacascript DOM节点——元素节点、属性节点、文本节点
2017/04/18 Javascript
微信小程序选择图片和放大预览图片功能
2017/11/02 Javascript
微信小程序网络层封装的实现(promise, 登录锁)
2019/05/08 Javascript
vue中beforeRouteLeave实现页面回退不刷新的示例代码
2019/11/01 Javascript
介绍Python的Django框架中的静态资源管理器django-pipeline
2015/04/25 Python
TensorFlow实现创建分类器
2018/02/06 Python
使用Django和Python创建Json response的方法
2018/03/26 Python
使用python存储网页上的图片实例
2018/05/22 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
详解CSS3媒体查询响应式布局bootstrap 框架原理实战(推荐)
2020/11/16 HTML / CSS
求职自荐书范文
2013/12/04 职场文书
年度考核自我鉴定
2014/02/02 职场文书
yy婚礼主持词
2014/03/14 职场文书
村干部培训方案
2014/05/02 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
python中__slots__节约内存的具体做法
2021/07/04 Python
看完这篇文章获得一些java if优化技巧
2021/07/15 Java/Android
mysql insert 存在即不插入语法说明
2022/03/25 MySQL