Python中方法链的使用方法

yipeiwu_com5年前Python基础

方法链(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中使用方法链?相信大家都有了一个大概的思路,希望本文所述对大家学习有所帮助。

相关文章

Django 多环境配置详解

本文也是开发项目中的一个小经验Tip,虽然很简单,但对很多朋友也有小帮助。 我们实际工程中,可能遇到开发环境、预上线环境、线上环境等环境场景,应用配置因此可能有所不同。 我的经验是利用环...

Python Selenium 之数据驱动测试的实现

Python Selenium 之数据驱动测试的实现

数据驱动模式的测试好处相比普通模式的测试就显而易见了吧!使用数据驱动的模式,可以根据业务分解测试数据,只需定义变量,使用外部或者自定义的数据使其参数化,从而避免了使用之前测试脚本中固定的...

python利用smtplib实现QQ邮箱发送邮件

python利用smtplib实现QQ邮箱发送邮件

python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。 下面是一个利用smtplib,实现QQ邮箱发送邮件的例子。 首先必须要打开QQ邮箱的s...

Django之Mode的外键自关联和引用未定义的Model方法

Django Model的外键自关联 在django的model定义中,有时需要某个Field引用当前定义的Model,比如一个部门(Department)的Model,它有一个字段是上...

Python更新数据库脚本两种方法及对比介绍

最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新。 第一种:使用python的MySQLdb模块利用原生的sql语句进行更新 im...