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

Abb*_*der 7 python design-patterns

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

调用示例:

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

method_v3(...)收到来自method_2(..)谁收到结果的结果时method 1(..)

请告诉我,上面的例子是否有模式或任何东西来决定?

Hun*_*len 9

有一个非常简单的模式叫做Builder Patternwhere方法基本上返回对当前对象的引用,因此它们不是链接方法调用,而是链​​接在对象引用上.

在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
Run Code Online (Sandbox Code Playgroud)

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

p = Person()
p.setName("Hunter")
 .setAge(24)
 .setSSN("111-22-3333")
Run Code Online (Sandbox Code Playgroud)

请记住,您实际上必须将方法与它们联系起来,p.a().b().c()因为Python不会忽略空格.

正如@MaciejGol在评论中指出的那样,您可以p像这样指定用空格链接:

p = (
   Person().setName('Hunter')
           .setAge(24)
           .setSSN('111-22-3333')
)
Run Code Online (Sandbox Code Playgroud)

不管这是否是Python 最好的风格/想法我都说不出来,但这就是它在Java中的样子.

  • 不,如果最后有一个逗号,则会创建一个1元素的元组.所有它的作用是暗示解释器表达式将跨越多行 - 多行字符串连接,多次导入等同样如此.它可以避免在每行末尾用``````转义换行换行符,在我看来,这会使眼睛流血. (3认同)