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 代码效率的方法
Jul 03 Python
python实现的简单RPG游戏流程实例
Jun 28 Python
Python使用Django实现博客系统完整版
Sep 29 Python
PyQt5每天必学之QSplitter实现窗口分隔
Apr 19 Python
python smtplib模块自动收发邮件功能(二)
May 22 Python
python实现电子产品商店
Feb 26 Python
numpy.random模块用法总结
May 27 Python
python pyinstaller打包exe报错的解决方法
Nov 02 Python
Python使用正则实现计算字符串算式
Dec 29 Python
Pytorch之finetune使用详解
Jan 18 Python
python读取yaml文件后修改写入本地实例
Apr 27 Python
基于Python爬取51cto博客页面信息过程解析
Aug 25 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删除数组中指定下标的元素方法
2018/02/03 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
PHP7内核CGI与FastCGI详解
2019/04/14 PHP
Javascript & DHTML 实例编程(教程)DOM基础和基本API
2007/06/02 Javascript
javascript nextSibling 与 getNextElement(node) 使用介绍
2011/10/13 Javascript
使用jQueryMobile实现滑动翻页效果的方法
2015/02/04 Javascript
Js为表单动态添加节点内容的方法
2015/02/10 Javascript
js实现基于正则表达式的轻量提示插件
2015/08/29 Javascript
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
2016/07/09 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
2016/12/08 Javascript
JS操作input标签属性checkbox全选的实现代码
2017/03/02 Javascript
JavaScript设计模式之调停者模式实例详解
2018/02/03 Javascript
webpack项目轻松混用css module的方法
2018/06/12 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
2020/02/23 Javascript
django 自定义用户user模型的三种方法
2014/11/18 Python
python数据结构之列表和元组的详解
2017/09/23 Python
pandas每次多Sheet写入文件的方法
2018/12/10 Python
python f-string式格式化听语音流程讲解
2019/06/18 Python
Python 函数list&read&seek详解
2019/08/28 Python
Python Pandas 转换unix时间戳方式
2019/12/07 Python
详解用Python进行时间序列预测的7种方法
2020/03/13 Python
利用纯CSS3实现tab选项卡切换示例代码
2016/09/21 HTML / CSS
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
大学毕业生通用自我评价
2014/01/05 职场文书
销售岗位职责范本
2014/06/12 职场文书
网吧消防安全责任书
2014/07/29 职场文书
农村文化建设标语
2014/10/07 职场文书
小学科学教学计划
2015/01/21 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
2015年行风建设工作总结
2015/05/15 职场文书
办公用品管理制度
2015/08/04 职场文书
高中优秀作文(范文)
2019/08/15 职场文书
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技
nginx.conf配置文件结构小结
2022/04/08 Servers