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中使用smtplib和email模块发送邮件实例
Apr 22 Python
详解Django中的ifequal和ifnotequal标签使用
Jul 16 Python
Python多线程经典问题之乘客做公交车算法实例
Mar 22 Python
python僵尸进程产生的原因
Jul 21 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
Jan 11 Python
Django中Forms的使用代码解析
Feb 10 Python
python得到一个excel的全部sheet标签值方法
Dec 10 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
Jun 24 Python
Python 计算任意两向量之间的夹角方法
Jul 05 Python
django rest framework vue 实现用户登录详解
Jul 29 Python
详解python中*号的用法
Oct 21 Python
Python 实现递归法解决迷宫问题的示例代码
Jan 12 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获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
php一个解析字符串排列数组的方法
2015/05/12 PHP
PHP数组与对象之间使用递归实现转换的方法
2015/06/24 PHP
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
jquery中的过滤操作详细解析
2013/12/02 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
react-native ListView下拉刷新上拉加载实现代码
2017/08/03 Javascript
JS实现非首屏图片延迟加载的示例
2018/01/06 Javascript
vue中实现先请求数据再渲染dom分享
2018/03/17 Javascript
Node.js的进程管理的深入理解
2019/01/09 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
python和bash统计CPU利用率的方法
2015/07/10 Python
python分析作业提交情况
2017/11/22 Python
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
2019/04/16 Python
python字典的遍历3种方法详解
2019/08/10 Python
PyCharm MySQL可视化Database配置过程图解
2020/06/09 Python
Python实现中英文全文搜索的示例
2020/12/04 Python
美国最好的保健品打折网店:Swanson
2017/08/04 全球购物
舒适的豪华鞋:Taryn Rose
2018/05/03 全球购物
微软台湾官方网站:Microsoft台湾
2018/08/15 全球购物
美国瑜伽服装和装备购物网站:Mukha Yoga
2019/02/22 全球购物
毕业生求职推荐信
2013/11/04 职场文书
《影子》教学反思
2014/02/21 职场文书
群教个人对照检查材料
2014/08/20 职场文书
2015年幼儿园新年寄语
2014/12/08 职场文书
学习杨善洲同志先进事迹心得体会
2016/01/23 职场文书
申论不会写怎么办?教您掌握这6点思维和原则
2019/07/17 职场文书
MySQL时间设置注意事项的深入总结
2021/05/06 MySQL