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ファイルが(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)
于 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 に答える