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 相关文章推荐
在Gnumeric下使用Python脚本操作表格的教程
Apr 14 Python
Python中用altzone()方法处理时区的教程
May 22 Python
python黑魔法之编码转换
Jan 25 Python
深入解析Python中的list列表及其切片和迭代操作
Mar 13 Python
python使用matplotlib绘制折线图教程
Feb 08 Python
Python装饰器语法糖
Jan 02 Python
django之状态保持-使用redis存储session的例子
Jul 28 Python
多个python文件调用logging模块报错误
Feb 12 Python
Python函数默认参数常见问题及解决方案
Mar 26 Python
opencv-python的RGB与BGR互转方式
Jun 02 Python
python 使用cycle构造无限循环迭代器
Dec 02 Python
pytorch锁死在dataloader(训练时卡死)
May 28 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 更新数据库中断的解决方法
2009/06/05 PHP
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
YII中assets的使用示例
2014/07/31 PHP
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
理解JSON:3分钟课程
2011/10/28 Javascript
fckeditor粘贴Word时弹出窗口取消的方法
2014/10/30 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
2015/03/19 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
使用puppeteer破解极验的滑动验证码
2018/02/24 Javascript
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
python使用wxPython打开并播放wav文件的方法
2015/04/24 Python
深入理解Python中变量赋值的问题
2017/01/12 Python
Python进度条实时显示处理进度的示例代码
2018/01/30 Python
Python异常处理操作实例详解
2018/08/28 Python
pandas通过字典生成dataframe的方法步骤
2019/07/23 Python
tensorflow模型继续训练 fineturn实例
2020/01/21 Python
python求解汉诺塔游戏
2020/07/09 Python
CSS3属性box-shadow使用指南
2014/12/09 HTML / CSS
HTML5网页录音和上传到服务器支持PC、Android,支持IOS微信功能
2019/04/26 HTML / CSS
美国购买和销售礼品卡平台:Raise
2017/01/13 全球购物
英国第一家领先的在线处方眼镜零售商:Glasses Direct
2018/02/23 全球购物
信息与计算科学专业推荐信
2014/02/23 职场文书
孝敬父母的演讲稿
2014/05/14 职场文书
选秀节目策划方案
2014/06/06 职场文书
团日活动总结怎么写
2014/06/25 职场文书
地下停车场租赁协议范本
2014/10/07 职场文书
迁户口计划生育证明
2014/10/19 职场文书
工作失职检讨书
2015/01/26 职场文书
2015年前台文员工作总结
2015/05/18 职场文书
退税申请报告怎么写
2015/05/18 职场文书
公司管理制度范本
2015/08/03 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
如何计划开一家便利店?
2019/07/31 职场文书
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript
python turtle绘图命令及案例
2021/11/23 Python