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
[email protected]
_______________________________________________
Tutor maillist - [email protected]
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor