【问题标题】:Performing a chain of actions on a variable对变量执行一系列操作
【发布时间】:2020-09-11 10:12:36
【问题描述】:

我需要对变量执行我定义的一系列操作。例如,我有变量a,链应该是这样的:

a.someAction1(some parameters).someAction2(some parameters).someAction2(some parameters).someAction2(some parameters)

所以这里.someAction1(some parameters)a 作为第一个参数并执行.someAction1(some parameters) 中定义的一些操作。在.someAction2(some parameters) 之后,使用.someAction1(some parameters) 的结果作为第一个参数并执行.someAction2(some parameters) 中定义的一些动作等等。 变量a 可以是任何类型(当然在定义someActions 之前我们知道a 的类型)。实现这一目标的最佳方法是什么?另请提供工作示例。

【问题讨论】:

  • 无论a.someAction1 返回什么,都必须有一个名为someAction2 的方法。如果所有这些方法都定义在同一个类中,那么它们都必须返回该类的值。最简单的方法是让每个方法简单地返回self
  • @chepner 您能否提供简单的工作示例来展示您的想法?例如a=2,现在对其执行someActions中定义的一些操作。
  • 显示的代码不适用于任意对象,例如 e。 G。 a=2。您必须以不同的方式编写它。
  • 你不能使用这种语法调用任意函数; someAction 不是 int 类的属性,所以 (2).someAction(...) 不起作用。
  • 如果您正在寻找诸如f(x, g(y, h(z, 2))) 之类的嵌套调用的替代方法,那么您可能正在寻找类似Coconut's 管道的东西:2 |> h$(z) |> g$(y) |> f$(x)。可以肯定的是,Python 本身没有这样的东西。

标签: python python-3.x oop functional-programming


【解决方案1】:

这种类型的链接对于可以应用于对象并返回相同类型的新对象的操作很有用。例如,我们可以在某种类型上定义一个运算 square 并返回输入的平方(返回是关键,因为链依赖于返回值)。对于该模式的示例,请考虑具有平方和平方根的 float 的包装器。

class Chainable:
      def __init__(self, val):
          self.val = val

      def square(self):
          self.val *= self.val
          return self #This is the key line here, by returning self we can make the chain

      def squareRoot(self):
          self.val = self.val**(1/2)
          return self

请注意,现在我们可以执行 Chainable(4).square().squareRoot()..... 等等,因为返回类型将始终定义该操作。

注意:您不一定需要返回 self。它只需要是同一类型。如果它们具有交互操作,您还可以有一些可以相互工作的类型可以使用此模式。关键是返回结果的一个实例,以便您可以直接链接函数调用。

【讨论】:

    猜你喜欢
    • 2014-08-12
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2013-10-19
    相关资源
    最近更新 更多