方法链接只是能够添加
.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 selfa = foo()a.linea.my_print()a.bara.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'



