【问题标题】:Recursion error with class inheritance类继承的递归错误
【发布时间】:2017-12-23 13:09:55
【问题描述】:

我有一个文件,其中包含我想用来存储 API 端点的类。 我想使用类的原因是我可以通过键入api.level2.resources 来访问端点。

这是文件的样子,API 作为主类,SubEntries 是“孩子”:

class API(object):
    """
    A class for logging to stdout and/or a file. Supports color output for different log kinds.
    """

    def __init__(self):
        """
        :param log_to_file: Bool - Whether to log to a file or only to stdout (False)
        :param s: String - Log file name without extension for success logs
        :param e: String - Log file name without extension for error logs
        :param prefix: Bool - Whether to show the prefix or not
        :param timestamp: Bool - Whether to show the timestamp or not
        :param debug: Bool - Whether to show debug messages or not
        """
        self.login = '/login'
        self.logout = '/logout'
        self.sysRequest = '/sysReq'
        self.level2 = SubEntries()


class SubEntries(API):

    def __init__(self):
        super().__init__()
        self.host_info = '/info'
        self.resources = '/resources'

但是,当我尝试像这样使用它时:

from src import API

api = API()
print(api.level2.resources)

我收到以下错误:

Traceback (most recent call last):
  File "D:/_projects/pynap/new.py", line 4, in <module>
    api = API()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
    super().__init__()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
    super().__init__()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
  ...
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
    super().__init__()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
    super().__init__()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
    super().__init__()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
    super().__init__()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
    super().__init__()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
    super().__init__()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
    super().__init__()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
    super().__init__()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
    super().__init__()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
    super().__init__()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
    super().__init__()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
    super().__init__()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
    super().__init__()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
    super().__init__()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
    super().__init__()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
  File "D:\_projects\pynap\src\QAPI.py", line 24, in __init__
    super().__init__()
  File "D:\_projects\pynap\src\QAPI.py", line 18, in __init__
    self.level2 = SubEntries()
RecursionError: maximum recursion depth exceeded while calling a Python object

我很确定解决方案很简单,我只是不确定如何构建类以便能够按照我的意愿使用它。

【问题讨论】:

  • 好吧,你期待什么?每当你实例化你的API 对象时,它的__init__() 方法就会被调用,然后它会实例化一个SubEntries 对象,该对象的__init__() 方法会被调用,它会调用它的父__init__() 方法来实例化另一个SubEntries 实例等等等等……
  • @zwer 我知道这一点,但我不知道如何以其他方式访问子类的值。我只想初始化父类,但仍然将子类及其值加载到level2中。

标签: python-3.x class oop inheritance


【解决方案1】:

正如我在评论中所说,您在这里非常明确地创建了一个循环引用,因此它有时会达到 Python 的递归限制。有很多方法可以避免相似类型对象的递归。最简单的是有一个共同的父母,例如:

class BaseAPI(object):
    # place here whatever you want common for all API/SubEntry objects
    pass

class API(BaseAPI):

    def __init__(self):
        self.login = '/login'
        self.logout = '/logout'
        self.sysRequest = '/sysReq'
        self.level2 = SubEntries()

class SubEntries(BaseAPI):

    def __init__(self):
        super(BaseAPI, self).__init__()
        self.host_info = '/info'
        self.resources = '/resources'

您还可以覆盖BaseAPI 类中的__getattr__()/__setattr__()/__delattr__() 方法,然后动态评估每个属性访问。您还可以将“端点”dict 传递给您的 BaseAPI 类,并让它更新其 self.__dict__ 以从传递的 dict 获取端点...

您的问题缺乏具体性,无法建议最佳方法。

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 2022-11-27
    • 1970-01-01
    • 2016-04-04
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多