📅  最后修改于: 2023-12-03 15:12:35.346000             🧑  作者: Mango
给定以下程序的输出:
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)。