基本方法链接

发布于 2021-01-29 18:58:24

我在python中发现了这种方法链接,但是即使有了它,我也无法理解Python中的方法链接。

这里的目标是两个:解决编码问题并理解方法链接(假设我对可调用对象仍然不是100%自信)。

到问题定义。

我想要一个具有两种方法的类:一种设置对象的参数=“ line”,另一种覆盖“ bar”。

这是我到目前为止所得到的:

class foo():
    def __init__(self, kind=None):
        self.kind = kind

    def __call__(self, kind=None):
        return foo(kind=kind)

    def my_print(self):
        print (self.kind)

    def line(self):
        return self(kind='line')
    def bar(self):
        return self(kind='bar')

不幸的是,用这段代码我可以实现我的目标

a = foo()
a.bar().line().bar().bar().line().my_print()

但是我想通过编写这段代码获得相同的结果

a = foo()
a.bar.line.bar.bar.line.my_print()

我该如何实现?我想我定义__call__方法的方式有问题。在此先感谢您的帮助。

关注者
0
被浏览
43
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    方法链接只是能够添加.second_func()任何.first_func()返回值。通过确保所有可链接的方法返回,可以很容易地实现它self。(请注意,这与无关__call()__)。

    class foo():
        def __init__(self, kind=None):
            self.kind = kind
        def my_print(self):
            print (self.kind)
            return self
        def line(self):
            self.kind = 'line'
            return self
        def bar(self):
            self.kind='bar'
            return self
    

    您可以foo通过忽略对象的返回值以非链接方式使用它们:

    a = foo()
    a.line()
    a.my_print()
    a.bar()
    a.my_print()
    
    assert a.kind == 'bar'
    

    或者,由于每个函数现在都返回对象本身,因此您可以直接对返回的值进行操作。您可以通过以下等效代码使用方法链接:

    b = foo()
    b.line().my_print().bar().my_print()
    assert b.kind == 'bar'
    

    甚至:

    c = foo().line().my_print().bar().my_print()
    assert c.kind == 'bar'
    

    摆脱()调用语法的问题是与方法链接 完全不同的概念
    。如果要使用链属性,并且使这些属性改变其对象,请使用@property装饰器。(但是,通过属性更改对象似乎很危险。最好使用方法并用动词命名:例如,.set_line()而不是.line。)

    class foo():
        def __init__(self, kind=None):
            self.kind = kind
        def my_print(self):
            print (self.kind)
            return self
        @property
        def line(self):
            self.kind = 'line'
            return self
        @property
        def bar(self):
            self.kind='bar'
            return self
    
    a = foo()
    a.line
    a.my_print()
    a.bar
    a.my_print()
    
    assert a.kind == 'bar'
    
    b = foo()
    b.line.my_print().bar.my_print()
    assert b.kind == 'bar'
    
    c = foo().line.my_print().bar.my_print()
    assert c.kind == 'bar'
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看