python: 使用包含变量的名称访问实例变量

7 投票
3 回答
7766 浏览
提问于 2025-04-17 08:49

在Python中,我想访问一个实例变量,但我需要用另一个变量的值来确定这个变量的名字。举个例子,实例变量是user.remote.directory,它指向的值是'servername:/mnt/.....',而user部分包含了用户的ID,比如说joe.remote.directory。

从另一个类中,我需要能够使用一个包含joe的用户ID的变量来访问joe.remote.directory。我试过用variable.remote.directory,但这样不行,有什么建议吗?

3 个回答

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:
           'joe@localhost://mnt/srv'
       """
       return '%s@%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()
8

你可以这样引用对象 obj 的实例变量 name

obj.__dict__['name']

因此,如果你有另一个变量 prop,它保存了你想要引用的实例变量的名字,你可以这样做:

obj.__dict__[prop]

如果你发现自己需要这样的功能,你应该问问自己,是否其实更适合使用一个 dict 的实例。

15

我不太确定你具体想要什么,但我觉得 getattr(obj, 'name') 可能会对你有帮助。你可以看看这个链接了解更多信息:http://docs.python.org/library/functions.html#getattr

撰写回答