2017-07-18 43 views
0

我有一个包含我想用来存储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 

我很确定解决方案很简单,我只是不确定如何构建类能够像我想要的那样使用它。

+0

那么,你期望什么?每当你实例化你的API对象时,它的'__init __()'方法被调用,然后实例化一个调用__init __()方法的'SubEntries'对象,该方法调用其父'__init __()'方法来实例化另一个'SubEntries'实例等,等等...... – zwer

+0

[如何调用超级构造函数?]的可能重复(https://stackoverflow.com/questions/2399307/how-to-invoke-the-super-构造函数) –

+0

@zwer我意识到这一点,但我不知道如何以任何其他方式访问子类的值。我只想初始化父级,但仍然将子类及其值加载到level2中。 – rhillhouse

回答

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__()方法,然后让每个属性访问动态评估。您还可以传递一个“端点” dictBaseAPI类,并把它从一个传递dict更新其self.__dict__获得端点...

你的问题缺乏特异性表明这将是最好的办法。