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下使用Txt2Html实现网页过滤代理的教程
Apr 11 Python
Python标准库inspect的具体使用方法
Dec 06 Python
python3 实现验证码图片切割的方法
Dec 07 Python
Python自动化导出zabbix数据并发邮件脚本
Aug 16 Python
python程序中的线程操作 concurrent模块使用详解
Sep 23 Python
40个你可能不知道的Python技巧附代码
Jan 29 Python
Python object类中的特殊方法代码讲解
Mar 06 Python
Python urllib2运行过程原理解析
Jun 04 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
Jun 30 Python
详解Open Folder as PyCharm Project怎么添加的方法
Dec 29 Python
python 逐步回归算法
Apr 06 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中使用cURL实现Get和Post请求的方法
2013/03/13 PHP
php递归删除指定文件夹的方法小结
2015/04/20 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
Thinkphp 框架扩展之行为扩展原理与实现方法分析
2020/04/23 PHP
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
不使用浏览器运行javascript代码的方法
2013/07/24 Javascript
js+CSS实现弹出居中背景半透明div层的方法
2015/02/26 Javascript
node基于puppeteer模拟登录抓取页面的实现
2018/05/09 Javascript
构建Vue大型应用的10个最佳实践(小结)
2019/11/07 Javascript
浅谈如何优雅处理JavaScript异步错误
2019/11/12 Javascript
jQuery操作选中select下拉框的值代码实例
2020/02/07 jQuery
解决vue+router路由跳转不起作用的一项原因
2020/07/19 Javascript
vue中组件通信详解(父子组件, 爷孙组件, 兄弟组件)
2020/07/27 Javascript
[01:13:08]2018DOTA2亚洲邀请赛4.6 淘汰赛 mineski vs LGD 第二场
2018/04/10 DOTA
pycharm 使用心得(二)设置字体大小
2014/06/05 Python
基于scrapy实现的简单蜘蛛采集程序
2015/04/17 Python
Python基于matplotlib绘制栈式直方图的方法示例
2017/08/09 Python
Django跨域请求CSRF的方法示例
2018/11/11 Python
详解python多线程之间的同步(一)
2019/04/03 Python
使用python实现离散时间傅里叶变换的方法
2019/09/02 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
2019/09/20 Python
python 哈希表实现简单python字典代码实例
2019/09/27 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
2020/02/07 Python
python yield和Generator函数用法详解
2020/02/10 Python
Python模拟登录和登录跳转的参考示例
2020/10/30 Python
美的官方商城:Midea
2016/09/14 全球购物
Dr. Martens马汀博士官网:马丁靴始祖品牌
2016/10/15 全球购物
Fairyseason:为个人和批发商提供女装和配件
2017/03/01 全球购物
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
意大利灯具购物网站:Lampade.it
2018/10/18 全球购物
what is the difference between ext2 and ext3
2015/08/25 面试题
介绍下Lucene建立索引的过程
2016/03/02 面试题
村党支部书记承诺书
2014/05/29 职场文书
技校毕业生自荐信
2014/06/03 职场文书
法学院毕业生求职信
2014/06/25 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书