Externally-defined properties?

Terry Hancock hancock at anansispaceworks.com
Wed Aug 24 08:15:03 CEST 2005

Frankly, I was surprised this worked at all, but I tried
creating a property outside of a class (i.e. at the module
level), and it seems to behave as a property:

>>> def get_x(ob):
...     global x
...     return str(x)
>>> def set_x(ob, value):
...     global x
...     x = int(value)
>>> def del_x(ob):
...     global x
...     del x
>>> def x_access():
...     return property(get_x, set_x, del_x, "X defined externally?")
>>> class Accessor(object):
...     s_x = x_access()
...     def __str__(self):
...         print "Accessor has x = %s" % self.s_X
>>> a = Accessor()
>>> a.s_x = 3
>>> a.s_x
>>> dir()
['Accessor', '__builtins__', '__doc__', '__name__', 'a', 'del_x', 'get_x', 'p', 'set_x', 'x', 'x_access']
>>> x

(of course in the real example, x will probably be in an
entirely different module, used as a library -- the client code
just calls a function to get a property that is automatically
managed for it).

So far, the only problem I see is that it only works if the
property is assigned to a new-type class attribute (otherwise,
the first assignment simply replaces the property).

I'm thinking of using this to tie a property of a class to an
external data source (a joystick axis, in fact -- or at least
its last-polled value).

There is a more convential way to do this, of course -- I could
just use a "get_value" function, but there is something attractive
about have a variable that is simply bound to the external
data source like this.  It seems like a good way to encapsulate
functionality that I don't really want the high level class to
have to "think" about.

I mention it here, because I've never seen a property used
this way.  So I'm either being very clever, or very dumb, 
and I would be interested in opinions on which applies. ;-)

Am I about to shoot myself in the foot?

Terry Hancock ( hancock at anansispaceworks.com )
Anansi Spaceworks  http://www.anansispaceworks.com

More information about the Python-list mailing list