88: Renamed ReadOnly._lock() to ReadOnly.__lock__(); updated subclasses and unit tests

This commit is contained in:
Jason Gerard DeRose 2008-08-08 21:49:09 +00:00
parent 3fe13d5945
commit 1744723d11
2 changed files with 38 additions and 35 deletions

View File

@ -36,6 +36,39 @@ def check_identifier(name):
raise errors.NameSpaceError(name, regex)
class ReadOnly(object):
"""
Base class for classes with read-only attributes.
"""
__locked = False
def __lock__(self):
assert self.__locked is False
self.__locked = True
def __setattr__(self, name, value):
"""
Raises an AttributeError if ReadOnly.__lock__() has already been called;
otherwise calls object.__setattr__()
"""
if self.__locked:
raise AttributeError('read-only: cannot set %s.%s' %
(self.__class__.__name__, name)
)
return object.__setattr__(self, name, value)
def __delattr__(self, name):
"""
Raises an AttributeError if ReadOnly.__lock__() has already been called;
otherwise calls object.__delattr__()
"""
if self.__locked:
raise AttributeError('read-only: cannot del %s.%s' %
(self.__class__.__name__, name)
)
return object.__delattr__(self, name)
class Abstract(object):
__public__ = frozenset()
@ -96,37 +129,7 @@ class Plugin(object):
)
class ReadOnly(object):
"""
Base class for classes with read-only attributes.
"""
__locked = False
def _lock(self):
assert self.__locked is False
self.__locked = True
def __setattr__(self, name, value):
"""
Raises an AttributeError if ReadOnly._lock() has already been called;
otherwise calls object.__setattr__()
"""
if self.__locked:
raise AttributeError('read-only: cannot set %s.%s' %
(self.__class__.__name__, name)
)
return object.__setattr__(self, name, value)
def __delattr__(self, name):
"""
Raises an AttributeError if ReadOnly._lock() has already been called;
otherwise calls object.__delattr__()
"""
if self.__locked:
raise AttributeError('read-only: cannot del %s.%s' %
(self.__class__.__name__, name)
)
return object.__delattr__(self, name)
class Proxy(ReadOnly):
@ -150,7 +153,7 @@ class Proxy(ReadOnly):
self.__public__ = base.__public__
assert type(self.__public__) is frozenset
check_identifier(self.name)
self._lock()
self.__lock__()
def __iter__(self):
@ -200,7 +203,7 @@ class NameSpace(ReadOnly):
self.__d[proxy.name] = proxy
assert not hasattr(self, proxy.name)
setattr(self, proxy.name, proxy)
self._lock()
self.__lock__()
def __iter__(self):
"""
@ -328,7 +331,7 @@ class API(ReadOnly):
def __init__(self, *allowed):
keys = tuple(b.__name__ for b in allowed)
self.register = Registrar(*allowed)
self._lock()
self.__lock__()
def __call__(self):
"""

View File

@ -127,7 +127,7 @@ def test_Plugin():
def test_ReadOnly():
obj = plugable.ReadOnly()
obj._lock()
obj.__lock__()
names = ['not_an_attribute', 'an_attribute']
for name in names:
no_set(obj, name)
@ -136,7 +136,7 @@ def test_ReadOnly():
class some_ro_class(plugable.ReadOnly):
def __init__(self):
self.an_attribute = 'Hello world!'
self._lock()
self.__lock__()
obj = some_ro_class()
for name in names:
no_set(obj, name)