How to use __setattr__ correctly, avoiding infinite recursion How to use __setattr__ correctly, avoiding infinite recursion python python

How to use __setattr__ correctly, avoiding infinite recursion


You must call the parent class __setattr__ method:

class MyTest(object):    def __init__(self, x):        self.x = x    def __setattr__(self, name, value):        if name=="device":            print "device test"        else:            super(MyTest, self).__setattr__(name, value)            # in python3+ you can omit the arguments to super:            #super().__setattr__(name, value)

Regarding the best-practice, since you plan to use this via xml-rpc I think this is probably better done inside the _dispatch method.

A quick and dirty way is to simply do:

class My(object):    def __init__(self):        self.device = self


Or you can modify self.__dict__ from inside __setattr__():

class SomeClass(object):    def __setattr__(self, name, value):        print(name, value)        self.__dict__[name] = value    def __init__(self, attr1, attr2):        self.attr1 = attr1        self.attr2 = attr2sc = SomeClass(attr1=1, attr2=2)sc.attr1 = 3


You can also use object.

class TestClass:    def __init__(self):            self.data = 'data'    def __setattr__(self, name, value):            print("Attempt to edit the attribute %s" %(name))            object.__setattr__(self, name, value)