Created
August 14, 2018 17:55
-
-
Save marodrig/41cff8c450aaba2f2aecc38d5c230eaf to your computer and use it in GitHub Desktop.
Three possible ways to implement the descriptor protocol in Python.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import re | |
class User(object): | |
def __init__(self): | |
self._phone_number = '' | |
@property | |
def phone_number(self): | |
return self._phone_number | |
@phone_number.setter | |
def phone_number(self, value): | |
if re.match(r'^(\d{3})-(\d{3})-(\d{4})', value): | |
print('Adding phone number for user: {}'.format(value)) | |
self._phone_number = value | |
else: | |
raise ValueError('Phone Number format does not match.') | |
@phone_number.deleter | |
def phone_number(self): | |
print("Deleting: {}".format(self._phone_number)) | |
del self._phone_number | |
if __name__ == '__main__': | |
py_user = User() | |
py_user.phone_number | |
py_user.phone_number = '800-123-4567' | |
del py_user.phone_number |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import re | |
class PyDescriptor(object): | |
def __init__(self): | |
self._name = None | |
def __get__(self, instance, owner): | |
print("Getting: {}".format(self._name)) | |
return self._name | |
def __set__(self, instance, value): | |
print("Setting: {}".format(self._name)) | |
print("To value: {}".format(value)) | |
self._name = value | |
def __delete__(self, instance): | |
print("Deleting: {}".format(self._name)) | |
del self._name | |
class User(object): | |
name = PyDescriptor() | |
if __name__ == '__main__': | |
py_user = User() | |
py_user.name | |
py_user.name = 'Harry' | |
del py_user.name |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import re | |
class User(object): | |
def __init__(self): | |
self._phone_number = '' | |
def fget(self): | |
return self._phone_number | |
def fset(self, value): | |
if re.match(r'^(\d{3})-(\d{3})-(\d{4})', value): | |
print('Adding phone number for user: {}'.format(value)) | |
self._phone_number = value | |
else: | |
raise ValueError('Phone Number format does not match.') | |
def fdel(self): | |
print("Deleting: {}".format(self._phone_number)) | |
del self._phone_number | |
phone_number = property(fget, fset, fdel, 'I am the phone number property.') | |
if __name__ == '__main__': | |
user = User() | |
user.phone_number = '123' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment