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 datetime时间格式化去掉前导0
Jul 31 Python
Python脚本实现网卡流量监控
Feb 14 Python
python中WSGI是什么,Python应用WSGI详解
Nov 24 Python
详解python实现线程安全的单例模式
Mar 05 Python
Django基于ORM操作数据库的方法详解
Mar 27 Python
详解Django之auth模块(用户认证)
Apr 17 Python
Python Grid使用和布局详解
Jun 30 Python
自定义django admin model表单提交的例子
Aug 23 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
Jan 03 Python
使用pytorch完成kaggle猫狗图像识别方式
Jan 10 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
Apr 19 Python
Python机器学习之KNN近邻算法
May 14 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脚本的10个技巧(1)
2006/10/09 PHP
phpmyadmin MySQL 加密配置方法
2009/07/05 PHP
网站用php实现paypal整合方法
2010/11/28 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
PHP获取二叉树镜像的方法
2018/01/17 PHP
js选取多个或单个元素的实现代码(用class)
2012/08/22 Javascript
jquery插件推荐浏览器嗅探userAgent
2014/11/09 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
AngularJS 日期格式化详解
2015/12/23 Javascript
angularjs创建弹出框实现拖动效果
2020/08/25 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
JavaScript跨域调用基于JSON的RESTful API
2016/07/09 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
利用js编写响应式侧边栏
2016/09/17 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
jQuery实现鼠标移入移出事件切换功能示例
2018/09/06 jQuery
JS实现数组去重,显示重复元素及个数的方法示例
2019/01/21 Javascript
javascript 模块依赖管理的本质深入详解
2020/04/30 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
numpy自动生成数组详解
2017/12/15 Python
使用OpCode绕过Python沙箱的方法详解
2019/09/03 Python
python中dict()的高级用法实现
2019/11/13 Python
Django密码存储策略分析
2020/01/09 Python
Jupyter Notebook远程登录及密码设置操作
2020/04/10 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
Belle Maison倍美丛官网:日本千趣会旗下邮购网站
2016/07/22 全球购物
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
介绍一下Java的事务处理
2012/12/07 面试题
车间组长岗位职责
2013/12/20 职场文书
买房协议书
2014/04/11 职场文书
煤矿安全演讲稿
2014/05/09 职场文书
会计工作总结范文2014
2014/12/23 职场文书
2015年行政工作总结范文
2015/04/09 职场文书
2015年小学美术工作总结
2015/05/25 职场文书
创业计划书之餐饮馄饨店
2019/07/18 职场文书