class Device(object):
data = None
def __init__(self, properties):
self.data = json.loads(properties)
pass
这是我的设备类,我想使用python中的循环将属性分配给由Json结果创建的对象。我的设备属性为'description' 'device_type','facility','id','latitude','longitude','sequence','source','update_date','web_url'
答案 0 :(得分:0)
有多种方法可以实现此目的。首先是使用setattr
方法:
other_properties = {'device_type': "usb", 'id', '12345'} # and on and on
d = Device(properties=some_properties)
for k, v in other_properties.items():
setattr(d, k, v) # this will set d.<key> = value
这相对简单易读,但是有些人可能会抱怨在self
之外设置__init__
属性。
接下来,您可以像以前一样将属性作为dict
传递,并在__init__
中解压缩它们:
class Device:
def __init__(self, **properties):
for k, v in properties.items():
setattr(self, k, v) # again using setattr
或者,如果您已经知道该项目的词典是什么,则可以提前在__init__
上设置关键字args并以这种方式解包
class Device:
def __init__(self, id=None, device_type=None, latitude=None): # ad nauseum
self.id = id
self.device_type = device_type
...
d = Device(**properties) # This syntax will unpack properties into the correct keyword args
另一种方法可能是在update
上调用Device.__dict__
,尽管对于为什么 not 这么做有肯定的论点
class Device:
def __init__(self, properties):
self.__dict__.update(properties)
最后,问题可能会提出:“您甚至需要在这里上课吗?”如果您只想存储键值对,则可以使用dict
并仅使用dict
样式的访问范例:
d = {**properties}
d.get('id') # 12345
或者,如果您希望访问类样式,则可以使用namedtuple
:
from collections import namedtuple
Device = namedtuple("Device", ['id', 'device_type', ...]) # Your other kwargs go here
d = Device(**properties)
d.id # 12345
要创建许多类/命名元组实例,可以使用列表理解或for循环来实现
For循环:
devices = []
for properties in records: # Where records is a list of json properties
devices.append(Device(**properties))
列表理解
devices = [Device(**properties) for properties in records
上面的代码假定properties
的行为类似于dictionary
,**
的解压缩将使用字典并将其解压缩为函数定义中正确的关键字参数。如果您传递的是string
,则将无法使用,这就是使用json
模块的原因。
json.loads
将string
对象解析为python对象类型。例如:
import json
r = json.loads('["a", "b", "c"]')
# listType ['a', 'b', 'c']
# r is a list object containing the strings 'a', 'b', 'c'
最常用于从json格式的字符串返回字典
mystr = '''
{ "id": 12345,
"device_type": "usb",
"loc": "abc12345"}'''
my_obj = json.loads(mystr)
# my_obj is a dict now
要将其与您在问题中定义的内容放在一起,假设您有一个json_string property
,并且想要像上面所做的那样将其加载到class
中。首先使用您的方法:
class Device:
def __init__(self, property_string):
properties = json.loads(property_string)
for k, v in properties.items():
setattr(self, k, v)
要使用我上面概述的方法,您只需进行json.loads
调用,并在类的外部 进行:
class Device:
def __init__(self, id=None, device_type=None, ...): # all of your attrs go there
self.id = id
self.device_type = device_type
... # more of the same here
properties = json.loads(property_string)
d = Device(**properties)