bute__ and properties and descriptors isn' all this feature comparison just kind of argumenttest your knowledgeanswers the __getattr__ method is run for fetches of undefined attributes only ( those not present on an instance and not inherited from any of its classesby contrastthe __getattribute__ method is called for every attribute fetchwhether the attribute is defined or not because of thiscode inside __getattr__ can freely fetch other attributes if they are definedwhereas __getattribute__ must use special code for all such attribute fetches to avoid looping or extra calls (it must route fetches to superclass to skip itself properties serve specific rolewhile descriptors are more general properties define getsetand delete functions for specific attributedescriptors provide class with methods for these actionstoobut they provide extra flexibility to support more arbitrary actions in factproperties are really simple way to create specific kind of descriptor--one that runs functions on attribute accesses coding differs tooa property is created with built-in functionand descriptor is coded with classthusdescriptors can leverage all the usual oop features of classessuch as inheritance moreoverin addition to the instance' state informationdescriptors have local state of their ownso they can sometimes avoid name collisions in the instance properties can be coded with decorator syntax because the property built-in accepts single function argumentit can be used directly as function decorator to define fetch access property due to the name rebinding behavior of decoratorsthe name of the decorated function is assigned to property whose get accessor is set to the original function decorated (name property(name)property setter and deleter attributes allow us to further add set and delete accessors with decoration syntax--they set the accessor to the decorated function and return the augmented property the __getattr__ and __getattribute__ methods are more genericthey can be used to catch arbitrarily many attributes in contrasteach property or descriptor provides access interception for only one specific attribute--we can' catch every attribute fetch with single property or descriptor on the other handproperties and descriptors handle both attribute fetch and assignment by design__get attr__ and __getattribute__ handle fetches onlyto intercept assignments as well__setattr__ must also be coded the implementation is also different__get attr__ and __getattribute__ are operator overloading methodswhereas properties and descriptors are objects manually assigned to class attributes unlike the othersproperties and descriptors can also sometimes avoid extra calls on assignment to unmanaged namesand show up in dir results automaticallybut are also test your knowledgequiz