Source code for proppy.core

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Proppy Core ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #

from .props import Property
from threading import Lock


[docs]class MetaProppy(type): """In order to use properties, a class must use this metaclass. """ @classmethod def __process_propname(cls, propname): assert isinstance(propname, str) assert propname.endswith('_prop') or propname.endswith('__prop') if propname.endswith('__prop'): return propname[:-6] else: return propname[:-5] def __new__(cls, name, bases, d): tmp_d = d.copy() d['_____prop_initializers_____'] = {} for name, attr in tmp_d.items(): if isinstance(attr, Property): instance_propname = cls.__process_propname(name) initializer = attr.make_property_init(instance_propname) getter = attr.make_getter(instance_propname) setter = attr.make_setter(instance_propname) d[instance_propname] = property(getter, setter) d['_____prop_initializers_____'][instance_propname ] = initializer return type.__new__(cls, name, bases, d) def __init__(self, name, bases, d): initializers = d['_____prop_initializers_____'] for name, init in initializers.items(): init(self) self._lock = Lock() super(object, self).__init__()