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中SocketServer 实现客户端与服务器间非阻塞通信
Dec 15 Python
win10环境下python3.5安装步骤图文教程
Feb 03 Python
Python 实现一行输入多个值的方法
Apr 21 Python
python 寻找离散序列极值点的方法
Jul 10 Python
python Gunicorn服务器使用方法详解
Jul 22 Python
pandas DataFrame创建方法的方式
Aug 02 Python
Python爬虫:url中带字典列表参数的编码转换方法
Aug 21 Python
python智联招聘爬虫并导入到excel代码实例
Sep 09 Python
Selenium alert 弹窗处理的示例代码
Aug 06 Python
如何一键升级Python所有包
Nov 05 Python
Python jiaba库的使用详解
Nov 23 Python
Python实现双向链表
May 25 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和ACCESS写聊天室(八)
2006/10/09 PHP
thinkphp实现数组分页示例
2014/04/13 PHP
php防止伪造数据从地址栏URL提交的方法
2014/08/24 PHP
php微信开发之谷歌测距
2018/06/14 PHP
无语,javascript居然支持中文(unicode)编程!
2007/04/12 Javascript
Dom在ajax技术中的作用说明
2010/10/25 Javascript
JavaScript中将一个值转换为字符串的方法分析[译]
2012/09/21 Javascript
实用的JS正则表达式(手机号码/IP正则/邮编正则/电话等)
2013/01/11 Javascript
一个简单的弹性返回顶部JS代码实现介绍
2013/06/09 Javascript
js对象的复制继承实例
2015/01/10 Javascript
js实现同一页面可多次调用的图片幻灯切换效果
2015/02/28 Javascript
Atitit.js的键盘按键事件捆绑and事件调度
2016/04/01 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
JavaScript创建、读取和删除cookie
2019/09/03 Javascript
python超简单解决约瑟夫环问题
2015/05/12 Python
Pandas之drop_duplicates:去除重复项方法
2018/04/18 Python
softmax及python实现过程解析
2019/09/30 Python
CSS3解决移动页面上点击链接触发色块的问题
2016/06/03 HTML / CSS
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
英国鹦鹉店:Parrot Essentials
2018/12/03 全球购物
求职者简历中的自我评价
2013/10/20 职场文书
入党申请人的自我鉴定
2013/12/01 职场文书
安全资金保障制度
2014/01/23 职场文书
亲子阅读的活动方案
2014/08/15 职场文书
演讲比赛的活动方案
2014/08/28 职场文书
2014年药房工作总结
2014/11/22 职场文书
千与千寻观后感
2015/06/04 职场文书
JavaScript如何优化逻辑判断代码详解
2021/06/08 Javascript
Python中的pprint模块
2021/11/27 Python
「海贼王」112.9万粉丝纪念图标公布
2022/03/21 日漫
SpringBoot整合Minio文件存储
2022/04/03 Java/Android
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android