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

Reply via email to