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中的条件判断语句基础学习教程
Feb 07 Python
numpy中索引和切片详解
Dec 15 Python
Python设计模式之中介模式简单示例
Jan 09 Python
windows下python安装小白入门教程
Sep 18 Python
详解多线程Django程序耗尽数据库连接的问题
Oct 08 Python
pycharm创建一个python包方法图解
Apr 10 Python
创建Django项目图文实例详解
Jun 06 Python
Python中面向对象你应该知道的一下知识
Jul 10 Python
Django 在iframe里跳转顶层url的例子
Aug 21 Python
Python编程快速上手——疯狂填词程序实现方法分析
Feb 29 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 Python
在python中对于bool布尔值的取反操作
Dec 11 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
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
2007/09/02 PHP
javascript 小型动画组件与实现代码
2010/06/02 PHP
PHP获取指定月份第一天和最后一天的方法
2015/07/18 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
PHP接口类(interface)的定义、特点和应用示例
2020/05/18 PHP
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
js 阻止子元素响应父元素的onmouseout事件具体实现
2013/12/23 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
2014/04/08 Javascript
jQuery修改CSS伪元素属性的方法
2014/07/30 Javascript
jQuery的remove()方法使用详解
2015/08/11 Javascript
JS中Select下拉列表类(支持输入模糊查询)功能
2017/01/17 Javascript
JavaScript框架Angular和React深度对比
2017/11/20 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
2019/07/29 Javascript
jQuery HTML获取内容和属性操作实例分析
2020/05/20 jQuery
详解React 元素渲染
2020/07/07 Javascript
Python生成pdf文件的方法
2014/08/04 Python
Python实现抓取网页并且解析的实例
2014/09/20 Python
Python 功能和特点(新手必学)
2015/12/30 Python
Python pass详细介绍及实例代码
2016/11/24 Python
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
django框架模板语言使用方法详解
2019/07/18 Python
详解Python图像处理库Pillow常用使用方法
2019/09/02 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
Windows下Sqlmap环境安装教程详解
2020/08/04 Python
Pycharm操作Git及GitHub的步骤详解
2020/10/27 Python
大学生村官心得体会范文
2014/01/04 职场文书
公司合作意向书范文
2014/07/30 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
2014年医院党建工作总结
2014/12/20 职场文书
杜甫草堂导游词
2015/02/03 职场文书
会计岗位职责范本
2015/04/02 职场文书
小学教师工作总结2015
2015/04/07 职场文书
首都博物馆观后感
2015/06/05 职场文书