""" Just for Fun A quick sketch of a Descriptor construct.
A descriptor is a type instance with a __get __ and __set__ protocol, also __delete__, and designed to satisfy a common need to manage setting and getting with mediating methods. http://docs.python.org/3.4/howto/descriptor.html (cc) Kirby Urner, MIT License O'Reilly School of Technology """ class Guardian: """ Takes a field name and a function for screening out banned values for said field name """ def __init__(self, fn, banned): self.field = fn self.banned = banned def __set__(self, obj, val): # print("Setting {} on {}".format(self.field, obj)) if self.banned(val): raise AttributeError("Can't be {}".format(val)) obj.__dict__[self.field] = val def __get__(self, obj, objtype): objtype.ringding() # calls class method return obj.__dict__[self.field] class Guest: # data descriptors age = Guardian("age", banned = lambda a: a in range(1,21)) # 21 or older fave_color = Guardian("fave_color", banned = lambda c: c in ["Orange", "Black"]) def __init__(self, n, age=0, fc=None): self.name = n # data descriptors always override instance dictionaries. self.age = age self.fave_color = fc @classmethod def ringding(cls): # called by __get__ in data descriptors print("Ring Ding!") def __repr__(self): return "Guest of name {}".format(self.name) t1 = Guest('Helga', 40) t2 = Guest('Vlad', 30) print("Age of t2:", t2.age) try: t1.age = 11 # comes up against banned() except AttributeError: print("No can do: 11") try: t1.fave_color = "Orange" # ditto banned() except AttributeError: print("No can do: Orange") t1.age = 22 t1.fave_color = "Green" # attributes stick to their respective instances if legal print(t1.age) print(t1.fave_color) print(t2.age)
_______________________________________________ Edu-sig mailing list Edu-sig@python.org https://mail.python.org/mailman/listinfo/edu-sig