2

This causes an infinite recursive loop when setattr is called, when trying to set the value for some_prop, which is a property with a setter:

class TypeSystem(object):

    def __setattr__(self, key, value):
        if the_special_case is True:
            # do something
        else:
            super(TypeSystem,self).__setattr__(key,value)


class Entity(TypeSystem):

    @property
    def some_prop(self):
        some_prop = self.data.get('some_prop')
        if some_prop is None and hasattr(self,"some_prop"):
            some_prop = self.some_prop
        return some_prop

    @some_prop.setter
    def some_prop(self,value):
        self.some_prop = value

>>> entity = Entity()
>>> entity.some_prop = 3

This works fine for normal attributes that aren't defined as properties because Super calls object's setattr to prevent the recursive loop.

But because some_prop isn't pre-defined, it looks like setattr is being invoked instead some_prop's setter so it gets pulled into a loop.

I have tried this as well....

@some_prop.setter
def some_prop(self, value):
    super(TypeSystem, self).__setattr__("some_prop", value)

But it still goes into a recursive loop. I'm not seeing how to avoid it.

1 Answer 1

10

This has nothing to do with __setattr__ or your TypeSystem. Your problem is

@some_prop.setter
def some_prop(self,value):
    self.some_prop = value

That is clearly an infinite loop - you're trying to set the property in the property's setter.

You have the same problem in the getter:

some_prop = self.some_prop

will cause an infinite loop as well -- you're trying to get the property in the property's getter.

You need to use another variable to hold the actual data:

class Entity(TypeSystem):

    @property
    def some_prop(self):
        some_prop = self.data.get('some_prop')
        if some_prop is None and hasattr(self,"_some_prop"):
            some_prop = self._some_prop
        return some_prop

    @some_prop.setter
    def some_prop(self,value):
        self._some_prop = value
Sign up to request clarification or add additional context in comments.

Comments

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.