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

Lin*_*ong 2 python

我有一个这样的课:

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

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

print user.username
print user.group_id
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这个?谢谢

onl*_*cai 6

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()
Run Code Online (Sandbox Code Playgroud)


Sma*_*ery 5

您可以使用以下setattr函数执行以下操作:

>>> class A(object):
    pass
>>> a = A()
>>> setattr(a, 'val', 4)
>>> a.val
4
Run Code Online (Sandbox Code Playgroud)

在你的情况,假设你解析的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)
Run Code Online (Sandbox Code Playgroud)