2011-12-22 19 views
5

python私は名前を決定するために別の変数の値を使用する必要があるインスタンス変数にアクセスしようとしています:例インスタンス変数:user.remote.directory 'servername:/ mnt/.....'の値を指し、ユーザー部分にはjoe.remote.directoryなどのユーザーのユーザーIDが含まれます。python:変数を含む名前を使用してインスタンス変数にアクセスする

別のクラスからアクセスする必要がありますjoe.remote.directoryには、ユーザーIDがjoeの変数を使用します。私はvariable.remote.directoryを試しましたが、それはうまくいきません。あなたは、インスタンス変数の名前を保持している別の変数propを持っている場合、あなたは、を参照したいのですが、

obj.__dict__['name'] 

したがって:

+3

これを行うには良い方法はほとんど常にあります。 Pythonは文字列名を使用して変数にアクセスすることを許可していますが、実際にはクルージングであり、実際にはプログラム全体を減速させることができます(Pythonがこれを検出したとき、行う)。 –

答えて

3

あなたはこの方法でオブジェクトobjnameと呼ばれるインスタンス変数を参照することができますこのようにそれを行うことができます。

obj.__dict__[prop] 

あなたがこの機能を必要とする自分自身を見つけた場合、あなたはそれがのインスタンスを使用するには良い状況が実際にいないかどうかを自分自身に問うべき0を代わりに使用します。

1

追加のユーザーオブジェクトを作成し、必要に応じて適切なオブジェクトまたは関数に渡すことをお勧めします。あなたはあまりにも漠然としているので、より現実的なアドバイスをするのは難しいです。

例:

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