📜  门| GATE CS 1996 |问题20(1)

📅  最后修改于: 2023-12-03 15:12:35.346000             🧑  作者: Mango

门| GATE CS 1996 |问题20

问题描述:

给定以下程序的输出:

class A:
    def __init__(self, val=0):
        self.val = val

    def foo(self):
        self.val += 1
        return self

    def __add__(self, other):
        return A(self.val + other.val)

    def __str__(self):
        return str(self.val)

a = A()
b = A(2)
c = A(4)
print(a.foo() + b.foo() + c.foo())

选项:

(A) 9

(B) 10

(C) 11

(D) 12

解答:

我们先看一下 foo 方法:

def foo(self):
    self.val += 1
    return self

这个方法实际上是让对象自身的值加 1 后返回自身的引用,这样可以方便链式调用。

接下来看 __add__ 方法:

def __add__(self, other):
     return A(self.val + other.val)

这个方法是让两个 A 类型的对象的 val 值相加,产生一个新的 A 类型的对象。

最后看一下整个程序的输出:

a = A()
b = A(2)
c = A(4)
print(a.foo() + b.foo() + c.foo())

首先 a.foo() 计算之后,a.val 变成了 1,foo() 返回了 a 的引用,链式调用的结果是 (a.foo() + b.foo()),也就是 self.val 等于 1, other.val 等于 2,相加还原得到新的 A 类型对象,即 A(3)。之后 c.foo() 计算之后,把 c.val 变成了 5,foo() 方法返回了 c 的引用。链式调用的结果是 (a.foo() + b.foo() + c.foo()),也就是 self.val 等于 3,other.val 等于 5,相加还原得到新的 A 类型对象,即 A(8)

所以程序输出的结果应该是 8,因此正确答案是选项 (D)。