2011-12-22 3 views
5

in python Sto tentando di accedere a una variabile di istanza in cui ho bisogno di utilizzare il valore di un'altra variabile per determinare il nome: Esempio di istanza Variabile: user.remote.directory dove punta al valore di 'nomeserver:/mnt/.....' e la parte utente contiene l'userid dell'utente, come joe.remote.directorypython: accesso a una variabile di istanza utilizzando un nome contenente una variabile

da un'altra classe che devo essere in grado di accedere joe.remote.directory utilizzando una variabile che contiene l'id utente di joe. Ho provato variabile.remote.directory ma non funziona, qualche suggerimento?

+3

C'è quasi sempre un modo migliore per fare questo. Mentre Python ti permette di accedere alle variabili usando i nomi delle stringhe, è davvero kludgy e può effettivamente * rallentare * l'intero programma (quando Python rileva che lo stai facendo, deve disattivare un sacco di ottimizzazioni che altrimenti potrebbe fare). –

risposta

3

È possibile fare riferimento a un'istanza variabile chiamata name dell'oggetto obj in questo modo:

obj.__dict__['name'] 

Pertanto, se si dispone di un'altra variabile prop che contiene il nome della variabile di istanza ti piacerebbe fare riferimento a, è può fare in questo modo:

obj.__dict__[prop] 

Se vi trovate a dover questa funzionalità, dovresti chiederti se non sia in realtà una buona circostanza di utilizzare un'istanza di dict invece.

1

Suggerirei di creare un oggetto utente in più, da passare agli oggetti o alle funzioni appropriate secondo necessità. Sei estremamente vago, quindi è difficile darti un consiglio più pratico.

Esempio:

class User: 
    def __init__(self, name, uid=None, remote=None, dir=None): 
     self.name = name 
     self.uid = uid 
     self.remote = remote 
     self.directory = dir 

    def get_X(self) 
     ... 

    def create_some_curios_String(self): 
     """ for uid = 'joe', remote='localhost' and directory = '/mnt/srv' 
      this method would return the string: 
      '[email protected]://mnt/srv' 
     """ 
     return '%[email protected]%s:/%s' % (self.uid, self.remote, self.directory) 


class AnotherClass: 
    def __init__(self, user_obj): 
     self.user = user_obj 

class YetAnotherClass: 
    def getServiceOrFunctionalityForUser(self, user): 
     doWhatEverNeedsToBeDoneWithUser(user) 
     doWhatEverNeedsToBeDoneWithUserUIDandRemote(user.uid, user.remote) 

joe = User('Joe Smith', 'joe', 'localhost', '/mnt/srv') 
srv_service = ServerService(joe.create_some_curios_String()) 
srv_service.do_something_super_important()