2010-07-02 17 views
16

Vorrei una chiamata di attributo come object.x per restituire i risultati di un metodo, ad esempio object.other.other_method(). Come posso fare questo?Python: Come fare riferimento ad attributo oggetto chiamare un metodo

Edit: ho chiesto un po 'presto: sembra che io possa fare questo con

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

È questo un modo OK per fare questo?

+2

Ri: la tua modifica - Sì e no ... la tua soluzione * memorizzerà * i risultati di 'object.other.other_method()' in 'object.x', il che significa che il metodo verrà chiamato una sola volta, non ogni tempo 'oggetto.x' viene letto. Se vuoi che il metodo venga chiamato ogni volta, @muksie ha ragione: controlla il decoratore 'property'. –

risposta

28

Utilizzare il decoratore proprietà

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

p = Test() 
p.x # returns 4 

Smarino con il __dict__ è sporca, specialmente quando @property è disponibile.

+0

C'è un modo per farlo dinamicamente? – zml

4

Utilizzare 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

Questo sarà solo chiamare other_method una volta quando viene creato

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

Invece si potrebbe fare questo

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

che chiama other_method ogni object.x si accede

Naturalmente non siete veramente utilizza object come un nome di variabile, vero?

+0

Heh, no non lo sono :). Grazie per la risposta, avere un upvote! – mellort

+0

Quando si utilizza questa opzione 'oggetto.x = proprietà (oggetto.other.other_method)', ottengo '' quando si accede all'attributo 'x', cosa dovrei fare in modo diverso? – zml

Problemi correlati