Вывод нескольких классов, вызывающих функции из разных классов - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь понять следующий код, где мне нужно определить вывод, который будет напечатан. Однако я застрял на полпути. Код (извините, я не могу определить правильный интервал):

# 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

I понимаю до 6- 3, но после этого не понимаю. Я думал, что b2.a.doubled () удвоит b2 (который, как я думал, перед удвоением равен 3, так как b2 = B (a1)), но, по-видимому, b2 равен 12, если его удвоить? И я думал, что а2 тоже удвоится, но а2 останется 3? Тогда почему после первого b1.a.doubled () удваиваются и a1, и b1 (поскольку оно увеличивается с 3 3 до 6 6)?

Ответы [ 3 ]

0 голосов
/ 06 февраля 2020

Код с правильной идентификацией:

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


def show(an_a_object, a_b_object):
    print '%d %d' % (an_a_object.i, a_b_object.a.i)


a1 = A()
b1 = B(a1)
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)

Внутри class B, self.a относится к тому же объекту, который был создан при вызове A(). модификация a - это то же самое, что модификация b.a, и оба экземпляра будут иметь одинаковое значение.

Этот код сложно читать из-за множества переменных с одинаковыми именами. Я рекомендую вам использовать более объяснительные имена, которые облегчают чтение.

0 голосов
/ 06 февраля 2020

Может быть интересно распечатать все результаты и проанализировать. Я изменил функцию __repr__ для классов A и B, чтобы мы могли легко печатать их между каждой операцией. Я добавил вывод между каждой строкой "print".

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

0 голосов
/ 06 февраля 2020

Я думал, что b2.a.doubled () удвоит b2

правильно.

(что, как я думал, было 3 до удвоения,

неверно. Это 6

, поскольку b2 = B (a1)),

и a1 было 6, так как оно было удвоено в line b1.a.doubled()

Как прокомментировал Чепнер,

Изменения, сделанные по одной ссылке, видны по другой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...