On Mar 6, 2:45 pm, "manstey" <[EMAIL PROTECTED]> wrote: > The question is, is it possible for an instance to have a value (say a > string, or integer) that can interact with other datatypes and be > passed as an argument? > > The following code of course gives an error: > > class Test(object): > def __init__(self, val): > self.val = val > > >>> a = Test('hello') > >>> a.val + ' happy' > 'hello happy' > >>> a + 'happy' > > TypeError: unsupported operand type(s) for +: 'Test' and 'str' > > Is there a way to make a have the value a.val when it is used as > above, or as an argument (eg function(a, 10, 'sdf') etc)? > > The only fudge I discovered for simple addition was to add to the > class > > def __add__(self, obj): > return a.val + obj > > but this doesn't solve the problem in general. I have tried > subclassing the string type, but as it is immutable, this is not > flexible the way a.val is (i.e. it can't e reassigned and remain a > subclass). > > Any pointers, or is my question wrong-headed? > > btw, my motivation is wanting to mimic another oo language which > allows this, so it allows: > > >>>Person.Address > 'Sydney' > >>>Person.Address.type > '%String' > >>>Person.Address = 'Canberra' > >>>print Person.Address. Person.Address.type > > Canberra %String > > etc. > > We have had to implement Person.Address as Person.Address.val, making > Address an instance with .val, .type, etc.
The question is not, "is it possible for an instance to have a value?", but "is it possible for a value to have other attributes?" If you really need them, you want Python descriptors, which are described here: http://docs.python.org/ref/descriptors.html. However, if type is the only value metadata you care about, you probably don't need them (just use the builtin 'type' function on any object). class TypedAttribute(object): def __init__(self, type=unicode): self.type = type def __get__(self, obj, unitclass=None): if obj is None: # When calling on the class instead of an instance... return self else: return obj._attributes[self.key] def __set__(self, obj, value): obj._attributes[self.key] = value def __delete__(self, obj): raise AttributeError("TypedAttributes may not be deleted.") class Person(object): Address = TypedAttribute(str) def __init__(self): self._attributes = {} I'm using the _attributes dict here just by convention; I find it convenient to store the underlying values in each parent object. There are other ways to do it. Robert Brewer System Architect Amor Ministries [EMAIL PROTECTED] -- http://mail.python.org/mailman/listinfo/python-list