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中的迭代器漫谈
Feb 03 Python
使用Python编写Linux系统守护进程实例
Feb 03 Python
Python简单计算数组元素平均值的方法示例
Dec 26 Python
Windows上使用Python增加或删除权限的方法
Apr 24 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
Jun 25 Python
Python实现深度遍历和广度遍历的方法
Jan 22 Python
Python中函数的基本定义与调用及内置函数详解
May 13 Python
详解python 破解网站反爬虫的两种简单方法
Feb 09 Python
深入浅析python变量加逗号,的含义
Feb 22 Python
Python numpy多维数组实现原理详解
Mar 10 Python
解决更改AUTH_USER_MODEL后出现的问题
May 14 Python
python多线程和多进程关系详解
Dec 14 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数据的提交与过滤基本操作实例详解
2016/11/11 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
2019/11/04 PHP
Mootools 1.2教程 输入过滤第二部分(字符串)
2009/09/15 Javascript
JQUERY dialog的用法详细解析
2013/12/19 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
jQuery实现统计输入文字个数的方法
2015/03/11 Javascript
使用JavaScript制作一个简单的计数器的方法
2015/07/07 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
2016/01/22 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
2016/09/29 Javascript
jQuery 插件实现随机自由弹跳气泡样式
2017/01/12 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
JS 验证密码 不能为空,必须含有数字、字母、特殊字符,长度在8-12位
2017/06/21 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
es6在react中的应用代码解析
2017/11/08 Javascript
使用命令行工具npm新创建一个vue项目的方法
2017/12/27 Javascript
vue.js实现带日期星期的数字时钟功能示例
2018/08/28 Javascript
webpack4 处理CSS的方法示例
2018/09/03 Javascript
vue双向绑定数据限制长度的方法
2019/11/04 Javascript
vue中的双向数据绑定原理与常见操作技巧详解
2020/03/16 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
js实现拖拽元素选择和删除
2020/08/25 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第二场 2月28日
2021/03/11 DOTA
python中私有函数调用方法解密
2016/04/29 Python
django foreignkey外键使用的例子 相当于left join
2019/08/06 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
python 解决Fatal error in launcher:错误问题
2020/05/21 Python
Python hashlib模块的使用示例
2020/10/09 Python
css3隔行变换色实现示例
2014/02/19 HTML / CSS
H5 canvas中width、height和style的宽高区别详解
2018/11/02 HTML / CSS
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
英国女性时尚品牌:Apricot
2018/12/04 全球购物
The Kooples美国官方网站:为情侣提供的法国当代时尚品牌
2019/01/03 全球购物
绝对经典成功的大学生推荐信
2013/11/08 职场文书
DIY胆机必读:各国电子管评价
2022/04/06 无线电