Как исправить порождение бесконечного цикла из метода __str__? - PullRequest
0 голосов
/ 29 мая 2018
File "C:\Users\kevin\Documents\Programs\ParLumen\trait.py", line 76, in __str__
    ret_str = super().__str__()
  File "C:\Users\kevin\Documents\Programs\ParLumen\trait.py", line 39, in __str__
    ret_str += f'{self.name}\n'
RecursionError: maximum recursion depth exceeded

Есть много-много строк, но повторяются те же самые две строки, а затем последняя, ​​другая строка: "RecursionError: превышена максимальная глубина рекурсии"

I 'Я не совсем уверен, почему это происходит.

Вот код, вызывающий проблему:

from abc import ABC, abstractmethod
from enum import Enum, unique

from parlumen.game import *

# Base Trait class
class Trait(ABC):

    def __init__(self, name, short_desc="No Desc", long_desc=None):
        self.name = name
        # self.value = value # may restrict this with req. 'avail_values()' func

        """
        if short_desc is not "No Desc":
            self.short_desc = short_desc
        """
        self.short_desc = short_desc

        if long_desc is None:
            self.long_desc = self.short_desc
        else:
            self.long_desc = long_desc

    @abstractmethod
    def __str__(self):
        ret_str = ""

        ret_str += f'{self.name}\n'
        ret_str += f'{self.long_desc}'

        return ret_str



# Area of Effect Definition

@unique
class Focus(Enum):
    NoFocus  = 'None'
    Origin   = 'Origin'
    Reversed = 'Reversed'

class AreaOfEffect(Trait):

    def __init__(self, area, focus=None):
        super().__init__(self, "Area of Effect")

        self.area = area

        if focus is None :
            self.focus = Focus.NoFocus
        else:
            self.focus = focus

        self.long_desc = f"Gives an attack or spell an area of effect of self.area"

    def __str__(self):
        ret_str = super().__str__()

        ret_str += f"\nArea of Effect: {self.area}, Focus: {self.focus}"

        return ret_str

aoe = AreaOfEffect(3, Focus.Origin)

print(aoe)

Более конкретно, проблема, кажется, относится к моему методу __str__ для Trait кажетсямне не нравится иметь self.name или self.long_desc - вот когда возникает проблема.

В общем, это своего рода беспорядок, но я действительно пытаюсь разобраться с этим, прежде чем продолжить.Странно, что это происходит только для Черты, а не для подкласса AreaOfEffect s __str__

1 Ответ

0 голосов
/ 29 мая 2018

Вам необходимо изменить:

super().__init__(self, "Area of Effect")

На:

super().__init__("Area of Effect")

Вы устанавливаете name для экземпляра объекта, который затем рекурсивно вызывает str при попытке отформатироватьname.

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