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对列表排序的方法实例分析
May 16 Python
Python中函数参数设置及使用的学习笔记
May 03 Python
python中os模块详解
Oct 14 Python
Python实现运行其他程序的四种方式实例分析
Aug 17 Python
Python使用progressbar模块实现的显示进度条功能
May 31 Python
flask session组件的使用示例
Dec 25 Python
Python GUI编程 文本弹窗的实例
Jun 11 Python
python绘制已知点的坐标的直线实例
Jul 04 Python
Python中新式类与经典类的区别详析
Jul 10 Python
TensorFlow MNIST手写数据集的实现方法
Feb 05 Python
Python实现天气查询软件
Jun 07 Python
在 Python 中利用 Pool 进行多线程
Apr 24 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制作新闻系统的思路
2006/10/09 PHP
PHP默认安装产生系统漏洞
2006/10/09 PHP
php生成局部唯一识别码LUID的代码
2012/10/06 PHP
php使用sql server验证连接数据库的方法
2014/12/25 PHP
织梦sitemap地图实时推送给百度的教程
2015/08/03 PHP
php cookie用户登录的详解及实例代码
2017/01/03 PHP
基于PHP+mysql实现新闻发布系统的开发
2020/08/06 PHP
PHP生成随机密码4种方法及性能对比
2020/12/11 PHP
List Information About the Binary Files Used by an Application
2007/06/11 Javascript
基于JavaScript 类的使用详解
2013/05/07 Javascript
使用JS画图之点、线、面
2015/01/12 Javascript
EasyUI中实现form表单提交的示例分享
2015/03/01 Javascript
纯JS实现本地图片预览的方法
2015/07/31 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
2015/09/04 Javascript
jQuery解析Json实例详解
2015/11/24 Javascript
BootStrap响应式导航条实例介绍
2016/05/06 Javascript
bootstrap的3级菜单样式,支持母版页保留打开状态实现方法
2016/11/10 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
VUE搭建手机商城心得和遇到的坑
2019/02/21 Javascript
详解微信小程序用定时器实现倒计时效果
2019/04/30 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
JavaScript经典案例之简易计算器
2020/08/24 Javascript
python定向爬取淘宝商品价格
2018/02/27 Python
Selenium元素的常用操作方法分析
2018/08/10 Python
django和vue实现数据交互的方法
2019/08/21 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
2019/08/28 Python
python实现的按要求生成手机号功能示例
2019/10/08 Python
Python 3.8正式发布,来尝鲜这些新特性吧
2019/10/15 Python
Python 利用OpenCV给照片换底色的示例代码
2020/08/03 Python
几款Python编译器比较与推荐(小结)
2020/10/15 Python
物理教师自荐信范文
2013/12/28 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
单位接收函格式
2015/01/30 职场文书
高中运动会前导词
2015/07/20 职场文书
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript