我在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'
本文向大家介绍R基本用法和链接,包括了R基本用法和链接的使用技巧和注意事项,需要的朋友参考一下 示例 管道运算符,%>%用于将参数插入函数。它不是该语言的基本功能,只能在附加提供该语言的软件包后才能使用magrittr。管道运算符采用管道的左侧(LHS),并将其用作函数的右侧的第一个参数(RHS)。例如: 管道可用于替换一系列函数调用。多个管道允许我们从左到右而不是从内到外读取和写入序列。例如,假
已成功创建nativetest.h文件 NativeTest.c代码 gcc-I/usr/java/jdk1.7.0_13/include-I/usr/java/jdk1.7.0_13/include/linux-o nativetest.so-shared nativetest.c 已成功创建共享对象文件。 当我执行nativetest时,它显示了以下错误 java-djava.library.
问题内容: 我在使用Java中的基本递归问题时遇到了很多麻烦;任何指针都很棒。 “写一种静态递归方法来打印出几何序列的第n个项:2、6、18、54。” 据我所知,我应该在代码中的某处递归地将某物乘以3,但我一直在努力寻找方法。我知道我需要终止声明,但是何时发生?我需要帮手方法吗? 问题答案: 一个递归函数是一个函数,它的实现引用自身。以下是一些有趣的示例: 解决问题的方法: 编辑 : 上面的类使用
方法链是Javascript中常用的编程模式,Giojs也支持使用方法链对参数进行配置。使用方法链,参数的设置会更加清晰可读。 以下的例子展示了如何使用Giojs方法链。(你也可以点击在线演示,然后查看例子的源码来详细了解方法链是如何应用在实际场景中的) 不使用方法链的API调用: controller.setSurfaceColor( "#00FF00" ); controller.setSel
主要内容:链栈元素入栈,链栈元素出栈,总结链栈 ,即用链表实现栈存储结构。 链栈的实现思路同顺序栈类似,顺序栈是将数 顺序表(数组)的一端作为栈底,另一端为栈顶;链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈底,如图 1 所示: 图 1 链栈示意图 将链表头部作为栈顶的一端,可以避免在实现数据 "入栈" 和 "出栈" 操作时做大量遍历链表的耗时操作。 链表的头部作为栈顶,意味着: 在实现数据"入栈"操作时,需要将数据从链表的头部插入
Qt 布局管理器是 Qt 图形用户界面设计的基本内容,在前面的几章中也断断续续的讲到 了 Qt 的布局管理器的使用,也做了一些简单的应用。本小节将详细介绍 Qt 的布局管理器,详细阐述 Qt 布局管理器的一些特性。 11.1.1 摆放窗口部件的方法 Qt 提供了几种在窗口部件上管理子窗口部件的基本方式。 一共有 3 种方法用于管理窗体上子窗口部件的布局:绝对位置法、人工布局法和布局管理器法。 相比