python - 多个类调用不同类的函数的输出
问题描述
我试图理解以下代码,我需要在其中确定将要打印的输出。但是,我被卡住了一半。代码(抱歉,我似乎无法正确设置间距):
# 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)?
解决方案
打印所有结果并进行分析可能会很有趣。我更改了__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
推荐阅读
- javascript - Highcharts Stockchart中的MonthPicker不改变月份
- r-markdown - 使用classoption时无法从R markdown生成横向微软word文档:风景
- php - 如何为首页和后续页面设置不同的下边距?
- php - 使用 1===1 时 PHP 语法错误,但在 1===0 时没有
- validation - Katalon Recorder - 验证篮子小计
- system-verilog - systemverilog 中的分层名称组件查找失败
- php - 获得最多一行的准备好的 MySQL 语句结果的最佳方法
- docker - 将目录中的所有目录复制到 Container 保留目录结构
- dialogflow-es - 如何从头开始和本地开发谷歌操作?
- swift - 类函数返回 Self?核心数据抽象类