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操作redis的方法
Jul 07 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
May 08 Python
Python利用BeautifulSoup解析Html的方法示例
Jul 30 Python
python实现图片处理和特征提取详解
Nov 13 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
python绘制直方图和密度图的实例
Jul 08 Python
python中pygame安装过程(超级详细)
Aug 04 Python
Python一键安装全部依赖包的方法
Aug 12 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 Python
Python内存映射文件读写方式
Apr 24 Python
如何使用Pytorch搭建模型
Oct 26 Python
Python开发工具Pycharm的安装以及使用步骤总结
Jun 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
基于HTTP长连接的"服务器推"技术的php 简易聊天室
2009/10/31 PHP
php 静态变量与自定义常量的使用方法
2010/01/26 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
thinkPHP模板算术运算相关函数用法分析
2016/07/12 PHP
php 开发中加密的几种方法总结
2017/03/22 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
2020/08/11 PHP
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
JavaScript中pop()方法的使用教程
2015/06/09 Javascript
Vue概念及常见命令介绍(1)
2016/12/08 Javascript
实现JavaScript高性能的数据存储
2016/12/11 Javascript
Javascript ES6中数据类型Symbol的使用详解
2017/05/02 Javascript
Koa项目搭建过程详细记录
2018/04/12 Javascript
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
vue选项卡切换登录方式小案例
2019/09/27 Javascript
JavaScript制作3D旋转相册
2020/08/02 Javascript
js实现页面图片消除效果
2020/03/24 Javascript
python之MSE、MAE、RMSE的使用
2020/02/24 Python
如何理解Python中包的引入
2020/05/29 Python
python mock测试的示例
2020/10/19 Python
英国高级百货公司:Harvey Nichols
2017/01/29 全球购物
环法自行车赛官方商店:Le Tour de France
2017/08/27 全球购物
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
Bata印度官网:源自欧洲舒适鞋履品牌
2020/01/30 全球购物
七年级音乐教学反思
2014/01/26 职场文书
信息工作经验交流材料
2014/05/28 职场文书
承诺书格式范文
2014/06/03 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
2014年行政后勤工作总结
2014/12/06 职场文书
广告业务员岗位职责
2015/02/13 职场文书
警告通知
2015/04/25 职场文书
贫困证明怎么写
2015/06/16 职场文书
幼儿园安全教育随笔
2015/08/14 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
2022/04/11 Vue.js