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

Reply via email to