Skip to content

Instantly share code, notes, and snippets.

@brickZA
Created December 23, 2011 11:12
Show Gist options
  • Save brickZA/1513902 to your computer and use it in GitHub Desktop.
Save brickZA/1513902 to your computer and use it in GitHub Desktop.
Python class decorator to automatically add lock-protected setters to variables
class AddLockSettersGetters(object):
class add(object):
def __init__(self, initial_value=None):
self.initial_value = initial_value
def __init__(self, lock_name):
self.lock_name = lock_name
def make_getter(self, name):
def getter(self):
return getattr(self, name)
return getter
def make_setter(self, name):
lock_name = self.lock_name
def setter(self, val):
with getattr(self, lock_name):
setattr(self, name, val)
return setter
def __call__(self, cls):
for name in dir(cls):
attr = getattr(cls, name)
if isinstance(attr, self.add):
assert (name.startswith('_'))
setattr(cls, name, attr.initial_value)
setattr(cls, 'set'+name, self.make_setter(name))
setattr(cls, 'get'+name, self.make_getter(name))
return cls
import threading
from add_lock_setters_getters import AddLockSettersGetters
# Instrumented lock class so you can see it actually works!
class OurLock(object):
def __init__(self):
self._lock = threading.Lock()
def __enter__(self):
print 'entering'
self._lock.__enter__()
print 'lock status: ', self._lock.locked()
def __exit__(self, type, value, traceback):
print 'exiting'
self._lock.__exit__(type, value, traceback)
print 'lock status: ', self._lock.locked()
@AddLockSettersGetters('locky')
class C(object):
def __init__(self):
self.locky = OurLock()
_target_az = AddLockSettersGetters.add(1)
_target_el = AddLockSettersGetters.add()
c = C()
print '_target_az: ', c._target_az
print '_target_el: ', c._target_el
c.set_target_az(10)
print c.get_target_az()
print c.get_target_el()
print '_target_az: ', c._target_az
print '_target_el: ', c._target_el
c.set_target_el(20)
print c.get_target_az()
print c.get_target_el()
print '_target_az: ', c._target_az
print '_target_el: ', c._target_el
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment