2

我有这样的课:

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

此类将从远程 api 加载用户信息并为此类设置相应的属性,以便我可以通过以下方式访问这些属性:

print user.username
print user.group_id

有什么方法可以实现吗?谢谢

4

4 回答 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()
于 2012-09-12T01:42:28.357 回答
6

您可以使用以下功能执行此类操作setattr

>>> class A(object):
    pass
>>> a = A()
>>> setattr(a, 'val', 4)
>>> a.val
4

在您的情况下,假设您解析的 json 文件提供了某种键值对(如字典),您可以遍历这些,然后setattr调用self; 像这样的东西(假设userinfo是一个字典):

class User:
    def __init__(self, uid):
        userinfo = json.load(urlopen(passportapi + 'user/' + uid))
        for key, value in userinfo.iteritems():
            setattr(self, key, value)
于 2012-09-12T01:18:12.800 回答
2

假设您的 JSON 请求返回一个 Python 字典:

class User:
    def __init__(self, uid):
        self.__dict__.update(json.load(urlopen(passportapi + 'user/' + uid)))
于 2012-09-12T01:31:29.453 回答
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 

我认为此方法将允许您执行其他操作,例如过滤某些关键字并引发自定义异常以访问您的数据。

于 2012-09-12T03:50:37.150 回答