Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> class Descriptor(object): ... def __init__(self, name): ... self.name = name ... def __set__(self, instance, val): ... print('Updating', self.name, 'for', instance) ... instance.__dict__[self.name] = val ... >>> class A: ... x = Descriptor('x') ... def __init__(self, name, x): ... self.x = x ... self.name = name ... def __repr__(self): ... return "I am {}".format(self.name) ... >>> a = A('a', 2) Traceback (most recent call last): File "", line 1, in File "", line 4, in __init__ File "", line 5, in __set__ File "", line 7, in __repr__ AttributeError: 'A' object has no attribute 'name' Updating x for >>> >>> # if I just turn around the assignments of self.x and self.name in A, ... # everything works as expected: ... >>> class A: ... x = Descriptor('x') ... def __init__(self, name, x): ... self.name = name ... self.x = x ... def __repr__(self): ... return "I am {}".format(self.name) ... >>> a = A('a', 2) Updating x for I am a >>> a.x 2