繁体   English   中英

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

[英]How to create attributes dynamically in python?

我有这样的课:

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

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

print user.username
print user.group_id

有什么办法可以实现呢? 谢谢

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()

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

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

在您的情况下,假设您解析的json文件提供了某种键/值对(如dict),则可以对其进行迭代,然后对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)

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

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

有时候,我希望拥有比“更新”所提供的更多的封装和控制。 我可能会完成您要这样做的事情:

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 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM