Повторение класса Python - PullRequest
       8

Повторение класса Python

1 голос
/ 12 июня 2019

Я не понимаю, почему мой код работает.У меня нет практического применения для этого кода;просто интересуюсь классами в python.

import sys
sys.setrecursionlimit(20)

class A():
    def __init__(self):
    self.a = object

    def rec(self,argument):
        self.a = argument

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

myObject = B()
myObject.rec(myObject)


print(myObject.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a)

Предел повторения должен запретить мне печатать последнюю строку.Но я могу назвать атрибут навсегда.

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

Это не рекурсия в том смысле, что может поглотить стек вызовов, что sys.setrecursionlimit имеет дело с :

Установить максимальную глубину стека интерпретатора Python для ограничения. , .

Это просто самостоятельная ссылка на один и тот же объект снова и снова, который не потребляет память или стековые кадры, как при рекурсивном вызове функции.

Думайте об этом как о связанном списке, но где каждый узел просто указывает на себя, а не на другой узел. Он будет занимать только достаточно памяти для самообращающегося узла, и, если вы не попытаетесь выполнить его рекурсивно, не потребует никаких рекурсивных вызовов функций.

Это (возможно) рекурсивная структура, а не набор рекурсивных вызовов функций.

2 голосов
/ 12 июня 2019

Термин «рекурсия» здесь не применяется. Буквально, это означает «вызывать / вызывать (проклинать) снова (повторно)». С точки зрения программного обеспечения, это для вызова функции, пока более ранний вызов все еще активен. Каждый вызов требует установки другого блока вызовов в стеке времени выполнения: адрес возврата, сохраненные регистры, аргументы и т. Д.

Ваш код называет атрибут объекта. Я вижу ваше замешательство: вы повторяете имя. Однако у синтаксического анализатора нет проблем, разрешающих это статически: он ищет смещение атрибута в объекте и включает вычисление этого смещения при поиске нужного значения атрибута. Это больше повторяющаяся сумма, чем сложенные блоки. Ваша ссылочная структура не является рекурсией .

...