Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 类继承的递归错误_Python 3.x_Class_Oop_Inheritance - Fatal编程技术网

Python 3.x 类继承的递归错误

Python 3.x 类继承的递归错误,python-3.x,class,oop,inheritance,Python 3.x,Class,Oop,Inheritance,我有一个包含我想用来存储API端点的类的文件。 我想使用类的原因是,我可以通过键入api.level2.resources来访问端点 以下是该文件的外观,其中API是主类,子项是“子项”: class API(object): """ A class for logging to stdout and/or a file. Supports color output for different log kinds. """ def __init__(self):

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

以下是该文件的外观,其中API是主类,子项是“子项”:

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

我非常确定这个解决方案很简单,我只是不确定如何构造类,以便能够像我所希望的那样使用它。

正如我在评论中所说的,您在这里非常明确地创建了一个循环引用,因此在某一点上它达到了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 _方法,然后动态评估每个属性访问。您还可以将“endpoints”dict传递给BaseAPI类,并让它更新其自身


你的问题缺乏明确性,无法说明什么是最好的方法。

好吧,你期望什么?每当你实例化你的API对象时,它的uuu init uuu方法被调用,然后实例化一个子条目对象,它的uuu init uu方法被调用,它调用它的父uuu init uuu方法实例化另一个子条目实例等等…我知道@zwer的可能重复,但我不知道如何以其他方式访问子类的值。我只想初始化父类,但仍然要将子类及其值加载到level2中。