Skip to content

Commit 6022353

Browse files
committed
-
1 parent a674468 commit 6022353

File tree

4 files changed

+35
-9
lines changed

4 files changed

+35
-9
lines changed

source_py3/python_toolbox/misc_tools/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@
55

66
from .misc_tools import *
77
from . import name_mangling
8-
from .proxy_property import ProxyProperty
8+
from .proxy_property import ProxyProperty
9+
from .overridable_property import OverridableProperty

source_py3/python_toolbox/misc_tools/overridable_property.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,24 +25,27 @@ def __init__(self, fget, doc=None, name=None):
2525
2626
You may specify a docstring as `doc`.
2727
'''
28-
OwnNameDiscoveringDescriptor.__init__(name=name)
29-
if not attribute_name.startswith('.'):
30-
raise Exception("The `attribute_name` must start with a dot to "
31-
"make it clear it's an attribute. %s does not "
32-
"start with a dot." % repr(attribute_name))
28+
OwnNameDiscoveringDescriptor.__init__(self, name=name)
3329
self.getter = fget
3430
self.__doc__ = doc
3531

32+
def _get_overridden_attribute_name(self, thing):
33+
return '_%s__%s' % (type(self).__name__, self.get_our_name(thing))
34+
3635

3736
def __get__(self, thing, our_type=None):
3837
if thing is None:
3938
# We're being accessed from the class itself, not from an object
4039
return self
4140
else:
42-
return self.getter(thing)
41+
overridden_attribute_name = self._get_overridden_attribute_name(thing)
42+
if hasattr(thing, overridden_attribute_name):
43+
return getattr(thing, overridden_attribute_name)
44+
else:
45+
return self.getter(thing)
4346

4447
def __set__(self, thing, value):
45-
setattr(thing, self.get_our_name(thing), value)
48+
setattr(thing, self._get_overridden_attribute_name(thing), value)
4649

4750
def __repr__(self):
4851
return '<%s: %s>' % (type(self).__name__, self.our_name or self.getter)

source_py3/test_python_toolbox/test_address_tools/test_describe.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ def test_bad_module_name():
246246
def test_function_in_something():
247247
'''Test `describe` doesn't fail when describing `{1: sum}`.'''
248248
if python_toolbox.__version_info__ <= (0, 7, 0, 'release'):
249-
raise nose.SkipTest("This test doesn't pass in `python_toolbox`"
249+
raise nose.SkipTest("This test doesn't pass in `python_toolbox` "
250250
"version 0.7.0 and below.")
251251
assert describe({1: sum}) == '{1: sum}'
252252
assert describe((sum, sum, list, chr)) == '(sum, sum, list, chr)'
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Copyright 2009-2015 Ram Rachum.
2+
# This program is distributed under the MIT license.
3+
4+
from python_toolbox import cute_testing
5+
6+
from python_toolbox.misc_tools import OverridableProperty
7+
8+
9+
def test():
10+
class A:
11+
@OverridableProperty
12+
def meow(self):
13+
return 'bark bark!'
14+
15+
a = A()
16+
assert a.meow == 'bark bark!'
17+
assert a.meow == 'bark bark!'
18+
assert a.meow == 'bark bark!'
19+
a.meow = 'Meow indeed, ma chérie.'
20+
assert a.meow == 'Meow indeed, ma chérie.'
21+
22+

0 commit comments

Comments
 (0)