Python中方法链的使用方法


Posted in Python onFebruary 23, 2016

方法链(method chaining)是面向对象的编程语言中的一种常见语法,可以让开发者在只引用对象一次的情况下,对同一个对象进行多次方法调用。举个例子:

假设我们有一个Foo类,其中包含有两个方法——bar和baz。

我们创建一个Foo类的实例:

foo = Foo()

如果不使用方法链,要想连续调用对象foo的bar和baz方法的话,我们得这样做:

foo.bar() # Call method bar() on object foo.
foo.baz() # Call method baz() on object foo.

如果使用方法链的话,我们就能这样实现: foo.bar().baz()

方法链的一个好处,是可以减少你使用对象名的次数。调用的方法越多,能够减少的次数就越多。因此,这个方法也能一定程度上减少需要阅读、测试、调试、维护的代码数量。这个好处不大,但也是有用的。

请注意,方法链的一个限制是,只能用在不需要返回其他值的方法上,因为你需要返回self对象。即使Python支持用一个return语句返回多个值,也可能无法解决这个问题。

下面是在Python中实现方法链的一个示例:

class Person:
  def name(self, value):
    self.name = value
    return self

  def age(self, value):
    self.age = value
    return self

  def introduce(self):
    print "Hello, my name is", self.name, "and I am", self.age, "years old."

person = Person()
person.name("EarlGrey").age(21).introduce()
# => Hello, my name is EarlGrey and I am 21 years old.

上面那种实现可能太简单了。下面我们来看一种更加现实的方法链使用方法:编写一个字符串处理程序string_processor.py,支持方法链。

import copy

class StringProcessor(object):
  '''
  A class to process strings in various ways.
  '''
  def __init__(self, st):
    '''Pass a string for st'''
    self._st = st

  def lowercase(self):
    '''Make lowercase'''
    self._st = self._st.lower()
    return self

  def uppercase(self):
    '''Make uppercase'''
    self._st = self._st.upper()
    return self

  def capitalize(self):
    '''Make first char capital (if letter); make other letters lower'''
    self._st = self._st.capitalize()
    return self

  def delspace(self):
    '''Delete spaces'''
    self._st = self._st.replace(' ', '')
    return self

  def rep(self):
    '''Like Python's repr'''
    return self._st

  def dup(self):
    '''Duplicate the object'''
    return copy.deepcopy(self)

def process_string(s):
  print
  sp = StringProcessor(s)
  print 'Original:', sp.rep()
  print 'After uppercase:', sp.dup().uppercase().rep()
  print 'After lowercase:', sp.dup().lowercase().rep()
  print 'After uppercase then capitalize:', sp.dup().uppercase().\
  capitalize().rep()
  print 'After delspace:', sp.dup().delspace().rep()

def main():
  print "Demo of method chaining in Python:"
  # Use extra spaces between words to show effect of delspace.
  process_string('hOWz It   GoInG?')
  process_string('The   QUIck  brOWn     fOx')

main()

下面是这个程序的运行结果:

$ python string_processor.py

Original: hOWz It   GoInG?
After uppercase: HOWZ IT   GOING?
After lowercase: howz it   going?
After uppercase then capitalize: Howz it   going?
After delspace: hOWzItGoInG?

Original: The   QUIck  brOWn     fOx
After uppercase: THE   QUICK  BROWN     FOX
After lowercase: the   quick  brown     fox
After uppercase then capitalize: The   quick  brown     fox
After delspace: TheQUIckbrOWnfOx

综上,我们可以发现,方法链有其用处,不过过度使用可能不太好。

如何在Python中使用方法链?相信大家都有了一个大概的思路,希望本文所述对大家学习有所帮助。

Python 相关文章推荐
Python 'takes exactly 1 argument (2 given)' Python error
Dec 13 Python
利用numpy+matplotlib绘图的基本操作教程
May 03 Python
django drf框架自带的路由及最简化的视图
Sep 10 Python
python定时任务 sched模块用法实例
Nov 04 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
Feb 27 Python
基于python实现获取网页图片过程解析
May 11 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
Jun 17 Python
python代码区分大小写吗
Jun 17 Python
python中Pexpect的工作流程实例讲解
Mar 02 Python
python爬不同图片分别保存在不同文件夹中的实现
Apr 02 Python
python Tkinter的简单入门教程
Apr 11 Python
python四个坐标点对图片区域最小外接矩形进行裁剪
Jun 04 Python
python开发之list操作实例分析
Feb 22 #Python
python开发之str.format()用法实例分析
Feb 22 #Python
python文件与目录操作实例详解
Feb 22 #Python
python文件操作相关知识点总结整理
Feb 22 #Python
python实现搜索本地文件信息写入文件的方法
Feb 22 #Python
Python和JavaScript间代码转换的4个工具
Feb 22 #Python
python实现识别相似图片小结
Feb 22 #Python
You might like
php基础知识:函数基础知识
2006/12/13 PHP
Thinkphp无限级分类代码
2015/11/11 PHP
PHP中Notice错误常见解决方法
2017/04/28 PHP
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
jQuery 源码分析笔记(4) Ready函数
2011/06/02 Javascript
javascript标签在页面中的位置探讨
2013/04/11 Javascript
dwz 如何去掉ajaxloading具体代码
2013/05/22 Javascript
浅谈toLowerCase和toLocaleLowerCase的区别
2016/08/15 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
JS实现太极旋转思路分析
2016/12/09 Javascript
vue如何获取点击事件源的方法
2017/08/10 Javascript
JavaScript中EventLoop介绍
2018/01/22 Javascript
JS实现点餐自动选择框(案例分析)
2019/12/10 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
2020/02/24 Javascript
vue 清空input标签 中file的值操作
2020/07/21 Javascript
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
微信小程序实现首页弹出广告
2020/12/03 Javascript
python正则分析nginx的访问日志
2017/01/17 Python
用Python设计一个经典小游戏
2017/05/15 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
Opencv+Python 色彩通道拆分及合并的示例
2018/12/08 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
python 实现读取csv数据,分类求和 再写进 csv
2020/05/18 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
2020/10/27 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
html5使用html2canvas实现浏览器截图的示例
2017/08/31 HTML / CSS
Vans荷兰官方网站:美国南加州的原创极限运动潮牌
2018/01/23 全球购物
Desigual英国官网:在线购买原创服装
2018/03/09 全球购物
副总经理工作职责
2013/11/28 职场文书
2014升学宴答谢词
2014/01/26 职场文书
新员工试用期自我鉴定
2014/04/17 职场文书
2015年小学体育工作总结
2015/05/22 职场文书
2015年小学教导处工作总结
2015/05/26 职场文书
通讯稿格式及范文
2015/07/22 职场文书
高中优秀作文(范文)
2019/08/15 职场文书
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python