如何在Python中动态创建属性?

3

我有一个类似这样的类:

class User:
    def __init__(self, uid):
        userinfo = json.load(urlopen(passportapi + 'user/' + uid))

这个类会从远程API中加载用户信息,并设置相应的属性,所以我可以通过以下方式访问这些属性:

print user.username
print user.group_id

有没有实现这个的方法?谢谢。

你在哪个部分遇到了困难? - undefined
我不知道如何编写这个类的代码,以便让我访问它的属性,比如 'print user.username'。 - undefined
这样怎么样?print vars(user)['username'] 你可以用任何你想要访问的属性名称来替换 'username' - undefined
我相信Smashery的答案更适合我的问题 :-) 只需要将他的代码写在__init__(self)中,一切都运行良好。 :-) - undefined
4个回答

8
import json

api_result = '{"username":"wawa","age":20}'

class User(object):
    def __init__(self, api_result):
        userinfo = json.loads(api_result)
        self.__dict__.update(userinfo)

import unittest

class DefaultTestCase(unittest.TestCase):
    def test_default(self):
        user = User(api_result)
        self.assertEqual(user.username, 'wawa')
        self.assertEqual(user.age, 20)

if __name__ == '__main__':
    unittest.main()

这是最完整的答案 :-) 谢谢。 - undefined

7
您可以使用 setattr 函数来完成这种操作:
>>> class A(object):
    pass
>>> a = A()
>>> setattr(a, 'val', 4)
>>> a.val
4

在您的情况下,假设您解析的JSON文件提供了一些键值对(例如字典),您可以通过这些进行迭代,并在self上调用setattr;类似于以下内容(假设userinfo是一个字典):

class User:
    def __init__(self, uid):
        userinfo = json.load(urlopen(passportapi + 'user/' + uid))
        for key, value in userinfo.iteritems():
            setattr(self, key, value)

2
假设您的JSON请求返回一个Python字典:
class User:
    def __init__(self, uid):
        self.__dict__.update(json.load(urlopen(passportapi + 'user/' + uid)))

1
有时候我喜欢比“更新”提供的更多封装和控制。我可能会像这样完成你试图做的事情:
class User(object):                                                             
    def __init__(self, api_result):                                             
        self.userinfo = json.loads(api_result)                                  

    def __getattr__(self, name):                                                
        if name in self.userinfo: return self.userinfo[name]                    
        raise AttributeError 

我认为这种方法可以让您做其他事情,比如过滤特定的关键词并针对访问数据引发自定义异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接