Python 3.x 类继承的递归错误
我有一个包含我想用来存储API端点的类的文件。 我想使用类的原因是,我可以通过键入api.level2.resources来访问端点 以下是该文件的外观,其中API是主类,子项是“子项”: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):
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中。