Mam taką klasę:

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

Ta klasa ładuje informacje o użytkowniku ze zdalnego API i ustawić odpowiednie atrybuty dla tej klasy, więc mogę uzyskać dostęp do tych atrybutów przez:

print user.username
print user.group_id

Czy jest jakiś sposób na wdrożenie tego? Dzięki

2
Lingfeng Xiong 12 wrzesień 2012, 05:15

4 odpowiedzi

Najlepsza odpowiedź
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()
7
onlytiancai 12 wrzesień 2012, 01:42

Możesz zrobić tego rodzaju za pomocą funkcji setattr:

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

W twoim przypadku, zakładając, że przebudowany plik JSON zapewnia pewną parę wartości kluczowej (jak dict), możesz po prostu iterować przez te, i zadzwonić setattr na self; coś takiego (zakładając {x2}} jest dict):

class User:
    def __init__(self, uid):
        userinfo = json.load(urlopen(passportapi + 'user/' + uid))
        for key, value in userinfo.iteritems():
            setattr(self, key, value)
5
Smashery 12 wrzesień 2012, 01:28

Zakładając, że żądanie JSON zwraca słownik Pythona:

class User:
    def __init__(self, uid):
        self.__dict__.update(json.load(urlopen(passportapi + 'user/' + uid)))
2
kindall 12 wrzesień 2012, 01:31

Czasami lubię mieć trochę więcej enkapsulacji i kontroli niż zaoferować "aktualizacja". Prawdopodobnie osiągnąłbym to, co próbujesz podoba:

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 

Myślę, że ta metoda pozwoli Ci robić inne rzeczy, takie jak filtrować niektóre słowa kluczowe i podnoszą niestandardowe wyjątki, aby uzyskać dostęp do danych.

1
user1539038 12 wrzesień 2012, 03:50