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入门篇之字典
Oct 17 Python
python的Crypto模块实现AES加密实例代码
Jan 22 Python
django限制匿名用户访问及重定向的方法实例
Feb 07 Python
Pandas实现数据类型转换的一些小技巧汇总
May 07 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
Python 自动登录淘宝并保存登录信息的方法
Sep 04 Python
django的403/404/500错误自定义页面的配置方式
May 21 Python
基于django micro搭建网站实现加水印功能
May 22 Python
浅析Python __name__ 是什么
Jul 07 Python
Spy++的使用方法及下载教程
Jan 29 Python
Python实现对齐打印 format函数的用法
Apr 28 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 DOS攻击实现代码(附如何防范)
2012/05/29 PHP
解析zend Framework如何自动加载类
2013/06/28 PHP
PHP之APC缓存详细介绍 apc模块安装
2014/01/13 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
PHP制作登录异常ip检测功能的实例代码
2016/11/16 PHP
PHP字符串和十六进制如何实现互相转换
2020/07/16 PHP
Dojo之路:如何利用Dojo实现Drag and Drop效果
2007/04/10 Javascript
js 文件引入实现代码
2010/04/23 Javascript
jQuery UI AutoComplete 自动完成使用小记
2010/08/21 Javascript
js怎么终止程序return不行换jfslk
2013/05/30 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
jQuery实现放大镜效果实例代码
2016/03/17 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
jQuery自定义元素右键点击事件(实现案例)
2017/04/28 jQuery
jQuery实现radio第一次点击选中第二次点击取消功能
2017/05/15 jQuery
webpack处理 css\less\sass 样式的方法
2017/08/21 Javascript
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
详解关于Vue2.0路由开启keep-alive时需要注意的地方
2018/09/18 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
Python基于sftp及rsa密匙实现远程拷贝文件的方法
2016/09/21 Python
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
完美解决在oj中Python的循环输入问题
2018/06/25 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
2019/04/11 Python
python返回数组的索引实例
2019/11/28 Python
python对Excel的读取的示例代码
2020/02/14 Python
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
英国天然宝石首饰购买网站:Gemondo Jewellery
2018/10/23 全球购物
安踏广告词改编版
2014/03/21 职场文书
党员一句话承诺大全
2014/03/28 职场文书
机房搬迁方案
2014/05/01 职场文书
实习推荐信
2014/05/10 职场文书
官僚主义现象查摆问题整改措施
2014/10/04 职场文书
家庭财产分割协议范文
2014/11/24 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书
小学语文国培研修日志
2015/11/13 职场文书