views:

69

answers:

4

I'd like for an attribute call like object.x to return the results of some method, say object.other.other_method(). How can I do this?

Edit: I asked a bit soon: it looks like I can do this with

object.__dict__['x']=object.other.other_method()

Is this an OK way to do this?

+10  A: 

Have a look at the built-in property function.

muksie
+6  A: 

Use the property decorator

class test(object): # make sure you inherit from object
    @property
    def x(self):
        return 4

p = test()
p.x # returns 4

Mucking with the _dict_ is dirty, especially when @property is available.

orangeoctopus
+2  A: 

Use a property

http://docs.python.org/library/functions.html#property

class MyClass(object):
    def __init__(self, x):
        self._x = x

    def get_x(self):
        print "in get_x: do something here"
        return self._x

    def set_x(self, x):
        print "in set_x: do something"
        self._x = x

    x = property(get_x, set_x)

if __name__ == '__main__':
    m = MyClass(10)
    # getting x
    print 'm.x is %s' % m.x
    # setting x
    m.x = 5
    # getting new x
    print 'm.x is %s' % m.x
PreludeAndFugue
+1  A: 

This will only call other_method once when it is created

object.__dict__['x']=object.other.other_method()

Instead you could do this

object.x = property(object.other.other_method)

Which calls other_method everytime object.x is accessed

Of course you aren't really using object as a variable name, are you?

gnibbler
Heh, no I am not :). Thanks for the answer, have an upvote!
mellort