使用中间结果调用链式方法

时间:2013-06-26 13:18:54

标签: python design-patterns

我有一个班级和一些方法。我可以在调用之间保留方法的结果吗?

示例呼叫:

  

result = my_obj.method_1(...)。method_2(...)。method_3(...)

method_v3(...)收到method_2(..)收到method 1(..)

结果的{{1}}的结果时

请告诉我,上面的例子中是否有模式或其他内容?

2 个答案:

答案 0 :(得分:9)

有一个非常简单的模式称为Builder Pattern,其中方法基本上返回对当前对象的引用,因此不是将方法调用链接在一起,而是将它们链接在对象引用上。

“Gang of Four”一书中描述的实际Builder模式有点冗长(为什么要创建一个构建器对象),而只是从每个self返回对setXXX()的引用以进行干净的方法链接。

在Python中看起来像这样:

class Person: 
   def setName(self, name):
      self.name = name
      return self   ## this is what makes this work

   def setAge(self, age):
      self.age = age;
      return self;

   def setSSN(self, ssn):
      self.ssn = ssn
      return self

你可以创造一个这样的人:

p = Person()
p.setName("Hunter")
 .setAge(24)
 .setSSN("111-22-3333")

请记住,您实际上必须使用p.a().b().c()链接方法,因为Python不会忽略空格。

正如@MaciejGol在评论中注明的那样,您可以像这样分配给p用空白链接:

p = (
   Person().setName('Hunter')
           .setAge(24)
           .setSSN('111-22-3333')
)

这是否是Python的最佳风格/想法我不能说,但这有点像它在Java中的样子。

答案 1 :(得分:0)

有多种选择完全取决于您的完整情景 -

  1. 责任链 - 如果您的不同类需要遵循一系列操作。
  2. 装饰器 - 当您不知道需要使用其他功能为类对象充值时需要哪个序列
  3. 构建器 - 可帮助您为类分配参数值。