首页 > 解决方案 > 多个类调用不同类的函数的输出

问题描述

我试图理解以下代码,我需要在其中确定将要打印的输出。但是,我被卡住了一半。代码(抱歉,我似乎无法正确设置间距):

# Let the classes A and B be
class A:
    def __init__ (self):
        self.i = 3
    def doubled (self):
        self.i *= 2

class B:
    def __init__ (self, an_a_object):
        self.a = an_a_object
    def put (self, an_a_object):
        self.a = an_a_object

# Further we have a program with the following statements/declarationsa
a1 = A()
b1 = B(a1)
def show (an_a_object, a_b_object):
    print '%d %d' % (an_a_object.i, a_b_object.a.i)

show(a1, b1)
b1.a.doubled()
show(a1, b1)
a2 = A()
show(a2, b1)
b1.put(a2)
show(a2, b1)
b2 = B(a1)
show(a1, b1)
b2.a.doubled()
show(a2, b2)
b1.a.doubled()
b2.put(b1.a)
show(a2, b2)

这个程序会打印什么?

所需输出:3 3

6 6

3 6

3 3

6 3

3 12

6 6

我直到 6 3 才明白,但在那之后我不明白。我认为 b2.a.doubled() 会使 b2 加倍(我认为在加倍之前是 3,因为 b2 = B(a1)),但显然 b2 在加倍时是 12?而且我认为a2也会加倍,但a2仍然是3?那么为什么在第一个 b1.a.doubled() 之后,a1 和 b1 都加倍(因为它从 3 3 变为 6 6)?

标签: pythonpython-2.7functionclassreference

解决方案


打印所有结果并进行分析可能会很有趣。我更改了__repr__A 类和 B 类的功能,因此我们可以在每次操作之间轻松打印它们。我在每个“打印”行之间添加了输出。

class A:
    def __init__ (self):
        self.i = 3

    def doubled (self):
        self.i *= 2

    def __repr__ (self):
        return str(self.i)

class B:
    def __init__ (self, an_a_object):
        self.a = an_a_object

    def put (self, an_a_object):
        self.a = an_a_object

    def __repr__ (self):
        return str(self.a.i)

a1 = A()
b1 = B(a1)
a2 = None
b2 = None

def show():
    print("a1 =", a1, ", a2 =", a2, ", b1 =", b1, ", b2 =", b2)

show()
# a1 = 3 , a2 = None , b1 = 3 , b2 = None

b1.a.doubled()
show()
# a1 = 6 , a2 = None , b1 = 6 , b2 = None

a2 = A()
show()
# a1 = 6 , a2 = 3 , b1 = 6 , b2 = None

b1.put(a2)
show()
# a1 = 6 , a2 = 3 , b1 = 3 , b2 = None

b2 = B(a1)
show()
# a1 = 6 , a2 = 3 , b1 = 3 , b2 = 6

b2.a.doubled()
show()
# a1 = 12 , a2 = 3 , b1 = 3 , b2 = 12

b1.a.doubled()
show()
# a1 = 12 , a2 = 6 , b1 = 6 , b2 = 12

b2.put(b1.a)
show()
# a1 = 12 , a2 = 6 , b1 = 6 , b2 = 6


推荐阅读