python中的方法链接

新手上路,请多包涵

(不要与 itertools.chain 混淆)

我正在阅读以下内容: http ://en.wikipedia.org/wiki/Method_chaining

我的问题是: 在 python 中实现方法链的最佳方式是什么?

这是我的尝试:

 class chain():
    def __init__(self, my_object):
        self.o = my_object

    def __getattr__(self, attr):
        x = getattr(self.o, attr)
        if hasattr(x, '__call__'):
            method = x
            return lambda *args: self if method(*args) is None else method(*args)
        else:
            prop = x
            return prop

list_ = chain([1, 2, 3, 0])
print list_.extend([9, 5]).sort().reverse()

"""
C:\Python27\python.exe C:/Users/Robert/PycharmProjects/contests/sof.py
[9, 5, 3, 2, 1, 0]
"""

一个问题是如果调用 method(*args) 修改 self.o 但不返回 None 。 (那么我应该返回 self 还是返回 method(*args) 返回的内容)。

有没有人有更好的方法来实现链接?可能有很多方法可以做到这一点。

我是否应该假设一个方法总是返回 None 所以我可能总是返回 self.o

原文由 Rusty Rob 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 351
2 个回答

警告:这仅适用于不打算返回任何数据的 class methods()。

我一直在寻找类似于链接 Class 函数的东西,但没有找到好的答案,所以这就是我所做的,我认为这是一种非常简单的链接方式:只需返回 self 对象。

所以这是我的设置:

 class Car:
    def __init__(self, name=None):
        self.name = name
        self.mode = 'init'

    def set_name(self, name):
        self.name = name
        return self

    def drive(self):
        self.mode = 'drive'
        return self

现在我可以为汽车命名并通过调用将其置于驱动状态:

 my_car = Car()
my_car.set_name('Porche').drive()

希望这可以帮助!

原文由 Sarang 发布,翻译遵循 CC BY-SA 4.0 许可协议

有一个非常方便的 Pipe 库,它可能是您问题的答案。例如::

 seq = fib() | take_while(lambda x: x < 1000000) \
            | where(lambda x: x % 2) \
            | select(lambda x: x * x) \
            | sum()

原文由 Zaur Nasibov 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏