我有一个这样的课程:
class User:
def __init__(self, uid):
userinfo = json.load(urlopen(passportapi + 'user/' + uid))
此类将从远程api加载用户信息并为此类设置相应的属性,以便我可以通过以下方式访问这些属性:
print user.username
print user.group_id
有没有办法实现这个? 感谢
答案 0 :(得分:5)
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()
答案 1 :(得分:4)
您可以使用setattr
函数执行此类操作:
>>> class A(object):
pass
>>> a = A()
>>> setattr(a, 'val', 4)
>>> a.val
4
在您的情况下,假设您解析的json文件提供某种键值对(如dict),您可以遍历这些键,并在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)
答案 2 :(得分:2)
假设您的JSON请求返回Python字典:
class User:
def __init__(self, uid):
self.__dict__.update(json.load(urlopen(passportapi + 'user/' + uid)))
答案 3 :(得分: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
我认为此方法可以让您执行其他操作,例如过滤某些关键字并引发用于访问数据的自定义异常。