【问题标题】:Python method/function chainingPython 方法/函数链接
【发布时间】:2018-07-04 14:45:38
【问题描述】:

在python中,是否可以将类方法和函数链接在一起?例如,如果我想实例化一个类对象并在其上调用一个影响实例变量状态的方法,我可以这样做吗?这是一个例子:

class Test(object):
    def __init__(self):
        self.x = 'Hello'

    @classmethod
    def make_upper(y):
        y.x = y.x.upper()

我想做的是:

h = Test().make_upper()

我想在一行代码中实例化一个类对象并影响变量的状态,但我也希望能够将多个可以影响状态或对对象执行其他操作的函数链接在一起。这在 python 中是否可能像在 jQuery 中一样?

【问题讨论】:

  • 如果您调用的每个方法都返回提供您要调用的下一个方法的对象,那么它将起作用。如果他们不这样做,就不会。这取决于你的方法是如何编写的。
  • 如果你所有的方法都返回自我,当​​然
  • 一般来说不是好的设计,但如果它适合你,它就适合你。
  • 另外,您可能不希望 make_upper 成为类方法。

标签: python chaining


【解决方案1】:

是的,当然。只需从您感兴趣的实例方法中返回self

class Test(object):
    def __init__(self):
        self.x = 'Hello'

    def make_upper(self):
        self.x = self.x.upper()
        return self
    def make_lower(self):
        self.x = self.x.lower()
        return self

h = Test().make_upper()
print(h.x)

输出:

HELLO

【讨论】:

    【解决方案2】:

    是的,不是的。链接当然有效,但hmake_upper() 的返回值,而不是Test() 返回的对象。你需要把它写成两行。

    h = Test()
    h.make_upper()
    

    然而PEP-572 最近被 Python 3.8 接受,这意味着有一天你可以编写

    (h := Test()).make_upper()
    

    Test() 的返回值分配给当前作用域中的h用作:= 表达式的值,然后调用其make_upper 方法。不过,我不确定在这种情况下我是否会推荐使用:=;当前所需的语法更具可读性。

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多