2010-07-02 19 views
16

Me gustaría que una llamada de atributo como object.x devuelva los resultados de algún método, digamos object.other.other_method(). ¿Cómo puedo hacer esto?Python: Cómo hacer referencia a un atributo de objeto llamar a un método

Edit: pidió un poco pronto: parece que puedo hacer esto con

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

¿Es esta una manera bien hacer esto?

+2

Re: su edición - Sí y no ... su solución * almacenará * los resultados de 'object.other.other_method()' en 'object.x', lo que significa que el método solo se llamará una vez, no cada uno time 'object.x' es leído. Si desea que se llame al método todas las veces, @muksie tiene razón, consulte el decorador 'property'. –

Respuesta

28

Utilice el decorador propiedad

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

p = Test() 
p.x # returns 4 

Mucking con el __dict__ es sucia, especialmente cuando @property está disponible.

+0

¿Hay alguna forma de hacerlo de forma dinámica? – zml

4

Utilice un 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 
2

Esto sólo se llamará other_method vez cuando se crea

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

su lugar se podría hacer esto

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

que se pide cada vez que se accede a other_methodobject.x

Por supuesto, usted no está realmente utilizando object como nombre de variable, es usted?

+0

Heh, no, no lo soy :). Gracias por la respuesta, ¡ten un voto positivo! – mellort

+0

Al usar esta opción 'object.x = property (object.other.other_method)', obtengo '' al acceder al atributo 'x', ¿qué debo hacer de forma diferente? – zml

Cuestiones relacionadas