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中在脚本中引用其他文件函数的实现方法
Jun 23 Python
Python中join函数简单代码示例
Jan 09 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
May 22 Python
python读取各种文件数据方法解析
Dec 29 Python
django中ORM模型常用的字段的使用方法
Mar 05 Python
Django 实现xadmin后台菜单改为中文
Nov 15 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
Dec 09 Python
python批量处理txt文件的实例代码
Jan 13 Python
Python如何用filter函数筛选数据
Mar 05 Python
用python计算文件的MD5值
Dec 23 Python
python 利用 PIL 将数组值转成图片的实现
Apr 12 Python
Python 文字识别
May 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
PHP+Ajax实现验证码的实时验证
2016/07/20 PHP
PHP利用二叉堆实现TopK-算法的方法详解
2017/04/24 PHP
jQuery 使用手册(七)
2009/09/23 Javascript
让FireFox支持innerText的实现代码
2009/12/01 Javascript
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
JS防止用户多次提交的简单代码
2013/08/01 Javascript
jquery新的绑定事件机制on方法的使用方法
2014/04/15 Javascript
javascript折半查找详解
2015/01/26 Javascript
Node.JS利用PhantomJs抓取网页入门教程
2017/05/19 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
[02:05]2014DOTA2西雅图国际邀请赛 BBC第二天小组赛总结
2014/07/11 DOTA
通过Python使用saltstack生成服务器资产清单
2016/03/01 Python
python用装饰器自动注册Tornado路由详解
2017/02/14 Python
python寻找list中最大值、最小值并返回其所在位置的方法
2018/06/27 Python
python实现图片批量压缩程序
2018/07/23 Python
Python之列表实现栈的工作功能
2019/01/28 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
安装python及pycharm的教程图解
2019/10/10 Python
python中rc1什么意思
2020/06/19 Python
python跨文件使用全局变量的实现
2020/11/17 Python
Pretty Little Thing爱尔兰:时尚女性服饰
2017/03/27 全球购物
法国床上用品商店:La Compagnie du lit
2019/12/26 全球购物
报考公务员诚信承诺书
2014/08/29 职场文书
技术入股合作协议书
2014/10/07 职场文书
一年级数学下册复习计划
2015/01/17 职场文书
培训班通知
2015/04/25 职场文书
活动总结模板大全
2015/05/11 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书
爱国主义教育主题班会
2015/08/13 职场文书
升职自荐书
2019/05/09 职场文书
Java9新特性对HTTP2协议支持与非阻塞HTTP API
2022/03/16 Java/Android
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS