to make sense of this decorator syntaxthoughwe must move ahead __getattribute__ and descriptorsattribute tools also in the class extensions departmentthe __getattribute__ operator overloading methodavailable for new-style classes onlyallows class to intercept all attribute referencesnot just undefined references this makes it more potent than its __get attr__ cousin we used in the prior sectionbut also trickier to use--it' prone to loops much like __setattr__but in different ways for more specialized attribute interception goalsin addition to properties and operator overloading methodspython supports the notion of attribute descriptors--classes with __get__ and __set__ methodsassigned to class attributes and inherited by instancesthat intercept read and write accesses to specific attributes as previewhere' one of the simplest descriptors you're likely to encounterclass agedesc(object)def __get__(selfinstanceowner)return def __set__(selfinstancevalue)instance _age value class descriptors(object)age agedesc( descriptors( age age _age runs agedesc __get__ runs agedesc __set__ normal fetchno agedesc call descriptors have access to state in instances of themselves as well as their client classand are in sense more general form of propertiesin factproperties are simplified way to define specific type of descriptor--one that runs functions on access descriptors are also used to implement the slots feature we met earlierand other python tools because __getattribute__ and descriptors are too substantial to cover well herewe'll defer the rest of their coverageas well as much more on propertiesto in the final part of this book we'll also employ them in examples in and study how they factor into inheritance in other class changes and extensions as mentionedwe're also postponing coverage of the super built-in--an additional major new-style class extension that relies on its mro--until the end of this before we get therethoughwe're going to explore additional class-related changes new-style class extensions