advanced programming techniques although __storage is class attributewe can access it as self __storage (just as we can call methods using self method())because python will look for it as an instance attributeand not finding it will then look for it as class attribute the one (theoreticaldisadvantage of this approach is that if we have class attribute and an instance attribute with the same nameone would hide the other (if this were really problem we could always refer to the class attribute using the classthat isexternalstorage __storage although hard-coding the class does not play well with subclassing in generalit doesn' really matter for private attributes since python name-mangles the class name into them anyway the implementation of the __get__(special method is slightly more sophisticated than before because we provide means by which the externalstorage instance itself can be accessed for exampleif we have point( )we can access the -coordinate with xand we can access the externalstorage object that holds all the xs with point to complete our coverage of descriptors we will create the property descriptor that mimics the behavior of the built-in property(functionat least for setters and getters the code is in property py here is the complete nameandextension class that makes use of itclass nameandextensiondef __init__(selfnameextension)self __name name self extension extension @property def name(self)return self __name uses the custom property descriptor @property uses the custom property descriptor def extension(self)return self __extension @extension setter uses the custom property descriptor def extension(selfextension)self __extension extension the usage is just the same as for the built-in @property decorator and for the @propertyname setter decorator here is the start of the property descriptor' implementationclass propertydef __init__(selfgettersetter=none)self __getter getter