8

for example i use this code:

class A(object):
    def __init__(self):
        self.dict1 = {
            'A': 3,
            'B': self.A}
    def __getattr__(self, key):
        if key in self.dict1:
            return self.dict1[key]
a = A()

and when it's runned it throws maximum recursion depth exceeded. Can someone please tell me what am i doing wrong here

1 Answer 1

13

The reference to self.dict1 inside your __getattr__ method causes __getattr__ to be called again, and so on, hence the infinite recursion. The only safe way to access attributes of self inside __getattr__ is by using references to self.__dict__. Try

def __getattr__(self, key):
    if key in self.__dict__['dict1']:
        return self.__dict__['dict1'][key]

Note also that the absence of an else clause will mean undefined attributes appear to have the value None.

Sign up to request clarification or add additional context in comments.

5 Comments

Tried you solution and it raise KeyError instead
That's because in trying to construct self.dict1 in the __init__ method you attempt tp access self.A. This triggers a call to __getattr__, which assumes the existence of self.dict1.
Maybe not very ellegant, but it works if i just set 'B' after dict1 is created like this: self.dict1['B'] = self.A
As long as you've got something that works. Elegance can come later!
Don't forget as well that if you implement __setattr__ the __init__ method should use self.__dict__['dict1'] = {}.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.