Python Non-Data Descriptor

Attributes are usually accessed or modified directly. However, if you want to add extra logic such as validating values, logging access, or enforcing type rules, you can use descriptors. Descriptors let you control what happens when an attribute is accessed, set or deleted. They are useful for adding validation, tracking usage or reusing the same logic across multiple classes.

class NoneDataDescriptor:
    def __get__(self , obj , objcls):
        print("__get__ is called ...")
        
class Sample:
    x = NoneDataDescriptor()
    
s1 = Sample()

s1.x
Python