Created
December 23, 2011 11:12
-
-
Save brickZA/1513902 to your computer and use it in GitHub Desktop.
Python class decorator to automatically add lock-protected setters to variables
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
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 |
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 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