2017-07-18 41 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__獲得端點...

你的問題缺乏特異性表明這將是最好的辦法。