2011-12-22 16 views
5

en python Estoy intentando acceder a una variable de instancia donde necesito usar el valor de otra variable para determinar el nombre: Variable de instancia de ejemplo: user.remote.directory donde apunta al valor de 'servername:/mnt/.....' y la porción del usuario contiene el userid del usuario, como joe.remote.directorypython: Accediendo a una variable de instancia usando un nombre que contiene una variable

de otra clase que necesito poder acceder joe.remote.directory utilizando una variable que contiene la identificación de usuario de joe. Intenté variable.remote.directory pero no funciona, ¿alguna sugerencia?

+3

Casi siempre hay una mejor manera de hacer esto. Si bien Python le permite acceder a variables usando nombres de cadenas, es realmente complicado y realmente puede * ralentizar * todo su programa (cuando Python detecta que está haciendo esto, tiene que desactivar un montón de optimizaciones que de lo contrario podría hacer). –

Respuesta

3

Se puede hacer referencia a la variable de instancia llamada name del objeto obj esta manera:

obj.__dict__['name'] 

Por lo tanto, si usted tiene otra variable prop que contiene el nombre de la variable de instancia que le gustaría hacer referencia a, se puede hacerlo de esta manera:

obj.__dict__[prop] 

Si ves que necesitas esta funcionalidad, debe preguntarse si no es en realidad una buena circunstancia para utilizar una instancia de dict en su lugar.

1

Le sugiero que cree un objeto de usuario adicional, que pase a los objetos o funciones apropiados según sea necesario. Estás siendo extremadamente vago, por lo que es difícil darte un consejo más práctico.

Ejemplo:

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() 
Cuestiones relacionadas