[Edu-sig] example code: Descriptors
kirby urner
kirby.urner at gmail.com
Sat Sep 27 10:01:16 CEST 2014
"""
Demonstrating the descriptor protocol
(cl) MIT by K. Urner
"""
class Property:
def __init__(self, start):
self.it = start
def __set__(self, obj, val):
if isinstance(obj, ReadOnly):
print("Can't set property from this child")
else:
obj.it = val
def __get__(self, obj, objtype=None):
if not hasattr(obj, "it"):
obj.it = self.it
return obj.it
class Thing:
property = Property(0)
class ReadOnly(Thing):
pass
class ReadWrite(Thing):
pass
# Test Code
# Subclasses treated differently
the_thing = ReadOnly()
print("Before:",the_thing.property)
the_thing.property = 42
print("After:",the_thing.property)
print("="*10)
the_thing = ReadWrite()
print("Before:", the_thing.property)
the_thing.property = 42
print("After:",the_thing.property)
# Multiple instances have their own values
print("="*10)
thing1 = Thing()
thing2 = Thing()
thing1.property = 1
thing2.property = 2
print("thing1.property:", thing1.property, thing1.__dict__)
print("thing2.property:", thing2.property, thing2.__dict__)
# from the docs: https://docs.python.org/3.4/howto/descriptor.html
class Dict(dict): # subclass rather than presume defining Dict top-level
def fromkeys(klass, iterable, value=None):
"Emulate dict_fromkeys() in Objects/dictobject.c"
d = klass()
for key in iterable:
d[key] = value
return d
fromkeys = classmethod(fromkeys)
print(Dict.fromkeys('abracadabra'))
# {'a': None, 'r': None, 'b': None, 'c': None, 'd': None}
OUTPUT from the above:
Before: 0
Can't set property from this child
After: 0
==========
Before: 0
After: 42
==========
thing1.property: 1 {'it': 1}
thing2.property: 2 {'it': 2}
{'a': None, 'r': None, 'b': None, 'c': None, 'd': None}
Process finished with exit code 0
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/edu-sig/attachments/20140927/e9655124/attachment.html>
More information about the Edu-sig
mailing list