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爬虫之urllib2中的两个重要概念:Openers和Handlers
Nov 05 Python
关于Python面向对象编程的知识点总结
Feb 14 Python
详解python中executemany和序列的使用方法
Aug 12 Python
shell命令行,一键创建 python 模板文件脚本方法
Mar 20 Python
python SMTP实现发送带附件电子邮件
May 22 Python
解决DataFrame排序sort的问题
Jun 07 Python
python石头剪刀布小游戏(三局两胜制)
Jan 20 Python
python+pyqt5实现KFC点餐收银系统
Jan 24 Python
Django 拆分model和view的实现方法
Aug 16 Python
Python csv模块使用方法代码实例
Aug 29 Python
Python面向对象多态实现原理及代码实例
Sep 16 Python
Python pygame实现中国象棋单机版源码
Jun 20 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生成局部唯一识别码LUID的代码
2012/10/06 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
jquery复选框CHECKBOX全选、反选
2008/08/30 Javascript
两个比较有用的Javascript工具函数代码
2010/02/17 Javascript
Notify - 基于jquery的消息通知插件
2011/10/18 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
ANGULARJS中用NG-BIND指令实现单向绑定的例子
2014/12/08 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
JavaScript中的对象序列化介绍
2014/12/30 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
2015/05/16 Javascript
Javascript中的arguments对象
2016/06/20 Javascript
Javascript基础回顾之(三) js面向对象
2017/01/31 Javascript
jQuery操作之效果详解
2017/05/19 jQuery
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
记录Django开发心得
2014/07/16 Python
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
2016/06/02 Python
Python采用Django开发自己的博客系统
2020/09/29 Python
python用reduce和map把字符串转为数字的方法
2016/12/19 Python
解决pycharm运行时interpreter为空的问题
2018/10/29 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
2019/02/21 Python
python opencv进行图像拼接
2020/03/27 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
2021/01/05 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
2021/01/05 Python
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
关于幼儿的自我评价
2013/12/18 职场文书
搞笑获奖感言
2014/01/30 职场文书
将相和教学反思
2014/02/04 职场文书
材料专业毕业生求职信
2014/02/26 职场文书
征兵宣传标语
2014/06/20 职场文书
jquery插件实现悬浮的菜单
2021/04/24 jQuery
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python