Python方法/函数链式调用

3

在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一样可以实现呢?

2
如果你调用的每个方法都返回提供下一个想要调用的方法的对象,那么它就可以工作。如果它们没有这样做,那么它就不行。这取决于你的方法是如何编写的。 - khelwood
1
如果你所有的方法都返回self,那么可以 - Mad Physicist
通常不是很好的设计,但如果它对您有效,那就可以。 - Mad Physicist
3
你可能不希望将 make_upper 定义为类方法。 - Mad Physicist
2个回答

5

当然可以。只需从您感兴趣的实例方法中返回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方法。不过,在这种情况下,我不确定是否建议使用:=,因为目前所需的语法更易读。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接