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中文乱码的解决方法
Nov 04 Python
Python实现网站文件的全备份和差异备份
Nov 30 Python
python实现根据用户输入从电影网站获取影片信息的方法
Apr 07 Python
Python 绘图和可视化详细介绍
Feb 11 Python
python 利用文件锁单例执行脚本的方法
Feb 19 Python
Python实现K折交叉验证法的方法步骤
Jul 11 Python
Python 3 使用Pillow生成漂亮的分形树图片
Dec 24 Python
python使用numpy实现直方图反向投影示例
Jan 17 Python
如何通过安装HomeBrew来安装Python3
Dec 23 Python
手把手教你配置JupyterLab 环境的实现
Feb 02 Python
Django+Celery实现定时任务的示例
Jun 23 Python
python自动化测试通过日志3分钟定位bug
Nov 20 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
设置jsf的选择框h:selectOneMenu为不可编辑状态的方法
2014/01/07 Javascript
JavaScript设计模式学习之“类式继承”
2015/03/12 Javascript
jQuery实现的导航下拉菜单效果示例
2016/09/05 Javascript
vue实现列表的添加点击
2016/12/29 Javascript
详解webpack+angular2开发环境搭建
2017/06/28 Javascript
vue组件Prop传递数据的实现示例
2017/08/17 Javascript
详解vue + vuex + directives实现权限按钮的思路
2017/10/24 Javascript
如何基于vue-cli3.0构建功能完善的移动端架子
2019/04/24 Javascript
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
基于node+websocket+html实现腾讯课堂聊天室聊天功能
2020/03/04 Javascript
JavaScript随机数的组合问题案例分析
2020/05/16 Javascript
[01:00:14]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第三场
2018/04/10 DOTA
python列表操作使用示例分享
2014/02/21 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
2017/03/16 Python
Python实现统计给定列表中指定数字出现次数的方法
2018/04/11 Python
python使用代理ip访问网站的实例
2018/05/07 Python
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
浅谈python之高阶函数和匿名函数
2019/03/21 Python
Django框架创建mysql连接与使用示例
2019/07/29 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
2019/08/26 Python
python实现代码统计器
2019/09/19 Python
PYTHON实现SIGN签名的过程解析
2019/10/28 Python
Python中BeautifuSoup库的用法使用详解
2019/11/15 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
Python爬虫爬取糗事百科段子实例分享
2020/07/31 Python
python 利用Pyinstaller打包Web项目
2020/10/23 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
2021/01/29 Python
英国水族馆和池塘用品购物网站:Warehouse Aquatics
2019/08/29 全球购物
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
国际贸易毕业生求职信范文
2014/02/21 职场文书
幸福家庭标语
2014/06/27 职场文书
2014年镇党建工作汇报材料
2014/11/02 职场文书
文艺晚会开场白
2015/05/29 职场文书
个人的事迹材料怎么写
2019/04/24 职场文书
Python selenium的这三种等待方式一定要会!
2021/06/10 Python
HTML怎么设置下划线?html文字加下划线方法
2021/12/06 HTML / CSS