Hi, In the following code, class attributes name and email is set to the instances of NonBlank.
class NonBlank: def __init__(self, storage_name): self.storage_name = storage_name def __set__(self, instance, value): if not isinstance(value, str): raise TypeError("%r must be of type 'str'" % self.storage_name) elif len(value) == 0: raise ValueError("%r must not be empty" % self.storage_name) instance.__dict__[self.storage_name] = value class Customer: name = NonBlank('name') email = NonBlank('email') def __init__(self, name, email, fidelity=0): self.name = name self.email = email self.fidelity = fidelity def full_email(self): return '{0} <{1}>'.format(self.name, self.email) if __name__ == '__main__': cus = Customer('Arup', 99) Running this code throws an error: Traceback (most recent call last): File "/Users/aruprakshit/python_playground/pycon2017/decorators_and_descriptors_decoded/customer.py", line 25, in <module> cus = Customer('Arup', 99) File "/Users/aruprakshit/python_playground/pycon2017/decorators_and_descriptors_decoded/customer.py", line 18, in __init__ self.email = email File "/Users/aruprakshit/python_playground/pycon2017/decorators_and_descriptors_decoded/customer.py", line 7, in __set__ raise TypeError("%r must be of type 'str'" % self.storage_name) TypeError: 'email' must be of type 'str' Process terminated with an exit code of 1 Now I am not getting how the __set__() method from NonBlank is being called inside the __init__() method. Looks like some magic is going on under the hood. Can anyone please explain this how self.name and self.email assignment is called the __set__ from NonBlank? What is the name of this concept? Thanks, Arup Rakshit a...@zeit.io _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor