当前位置: 首页 > 面试题库 >

基本方法链接

晏晨朗
2023-03-14
问题内容

我在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 种方法用于管理窗体上子窗口部件的布局:绝对位置法、人工布局法和布局管理器法。 相比