How can I modify a Python attribute any time it is accessed?
Originally posted on my Python Wiki
I was designing a UI for a PyGame program I am working on, and needed a way to pass a value defining a “row height” into the functions that rendered my text to the screen. Since the UI could change, I didn’t want to have to hard-code positions into each element, later to modify it and have to redo all the positions.
What I came up with was a simple class with a single usable attribute, called val
. Through using properties, I’m able to control how the attr behavies at time time its value is queried:
class Row(object): # class to store the current row location in the UI # Each time it is called, it will increment its value def __init__(self, val): self._val = 0 self.orig = val @property def val(self): self._val = self._val + self.orig return self._val row = Row(16) print row.val, row.val, row.val, row.val # 16 32 48 64
Properties have getter, setter, and deleter methods, but the default is getter, which I used above. So as you can see, each time I call to print
, it accesses the val
property (via the getter), and updates the internal counter.
This is a PyGame code snippet showing it in use:
overlay.blit(bubble, (8, row.val)) overlay.blit(toggleText, (8, row.val)) overlay.blit(lmb, (8, row.val))
Rather than having to specify a Y
value for the last arg of the tuple, I can simply pass in my object, and it passes out the current new position, based on how many times it was called before.
I have no doubt there is probably some slicker way in Python, but it’s what I came up with on the spot