基本方法链接
我在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__
方法的方式有问题。在此先感谢您的帮助。
-
方法链接只是能够添加
.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'