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通过ElementTree操作XML获取结点读取属性美化XML
Dec 02 Python
python创建关联数组(字典)的方法
May 04 Python
浅谈python中的__init__、__new__和__call__方法
Jul 18 Python
用Python实现KNN分类算法
Dec 22 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
Aug 14 Python
Python3 文章标题关键字提取的例子
Aug 26 Python
python3实现往mysql中插入datetime类型的数据
Mar 02 Python
Python itertools.product方法代码实例
Mar 27 Python
Python如何转换字符串大小写
Jun 04 Python
Django之腾讯云短信的实现
Jun 12 Python
pytorch中的model=model.to(device)使用说明
May 24 Python
Python干货实战之八音符酱小游戏全过程详解
Oct 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
杏林同学录(九)
2006/10/09 PHP
php curl登陆qq后获取用户信息时证书错误
2015/02/03 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
2015/12/22 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
prototype 的说明 js类
2006/09/07 Javascript
jquery 删除cookie失效的解决方法
2013/11/12 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
AngularJS中处理多个promise的方式
2016/02/02 Javascript
JS实现消息来时让网页标题闪动效果的方法
2016/04/20 Javascript
JS实现间歇滚动的运动效果实例
2016/12/22 Javascript
JS中正则表达式全局匹配模式 /g用法详解
2017/04/01 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
JS实现深度优先搜索求解两点间最短路径
2019/01/17 Javascript
微信小程序整合使用富文本编辑器的方法详解
2019/04/25 Javascript
vue+Element实现搜索关键字高亮功能
2019/05/28 Javascript
详解新手使用vue-router传参时注意事项
2019/06/06 Javascript
Python open读写文件实现脚本
2008/09/06 Python
python去除所有html标签的方法
2015/05/05 Python
Python RabbitMQ消息队列实现rpc
2018/05/30 Python
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
Python实现的文轩网爬虫完整示例
2019/05/16 Python
python实现opencv+scoket网络实时图传
2020/03/20 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
Python3爬虫关于代理池的维护详解
2020/07/30 Python
利用python爬取有道词典的方法
2020/12/08 Python
Python读写Excel表格的方法
2021/03/02 Python
机械制造专业个人的自我评价
2013/12/28 职场文书
公司司机岗位职责范本
2014/03/03 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
2014年秋季新学期寄语
2014/08/02 职场文书
学校领导四风问题整改措施思想汇报
2014/10/09 职场文书
街道务虚会发言材料
2014/10/20 职场文书
毕业设计致谢词
2015/05/14 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers