Python 从字典初始化对象。附加到列表时覆盖值
我试图在csv文件中基于模式填充类对象。不需要硬编码任何东西 根据下面的代码,当我将一个对象附加到列表中时,它会覆盖相同类型的前一个对象。我试图专门使用Copy.deepcopy()复制模块,但没有成功 有人能解释一下原因吗?我认为这与我如何从字典中检索类对象并将其附加到列表中有关 从复制导入deepcopyPython 从字典初始化对象。附加到列表时覆盖值,python,python-3.x,Python,Python 3.x,我试图在csv文件中基于模式填充类对象。不需要硬编码任何东西 根据下面的代码,当我将一个对象附加到列表中时,它会覆盖相同类型的前一个对象。我试图专门使用Copy.deepcopy()复制模块,但没有成功 有人能解释一下原因吗?我认为这与我如何从字典中检索类对象并将其附加到列表中有关 从复制导入deepcopy class SomeClass(object): def __init__(self, a, b, c, d): self.a = a self.b
class SomeClass(object):
def __init__(self, a, b, c, d):
self.a = a
self.b = b
self.c = c
self.d = d
class AnotherClass(object):
def __init__(self, aa, bb, cc, dd):
self.aa = aa
self.bb = bb
self.cc = cc
self.dd = dd
class LookUpValues(object):
LOOKUP_DICTIONARY = {
"SCHEMA_A": SomeClass,
"SCHEMA_B": AnotherClass
}
def get_object_list(csv_data):
obj_list = []
for item in csv_data:
some_obj = LookUpValues.LOOKUP_DICTIONARY[item[0]]
for column in item[1]:
setattr(some_obj, column[0], column[1])
obj_list.append(some_obj)
return obj_list
def get_object_list_deepcopy(csv_data):
obj_list = []
for item in csv_data:
some_obj = LookUpValues.LOOKUP_DICTIONARY[item[0]]
for column in item[1]:
setattr(some_obj, column[0], column[1])
obj_list.append(deepcopy(some_obj))
return obj_list
def print_object_list(object_list):
for i, obj in enumerate(object_list):
if i < 1:
print(obj.a)
else:
print(obj.aa)
if __name__ == '__main__':
data_from_csv = [
["SCHEMA_A", [('a', 1), ('b', 2), ('c', 3), ('d', 4)]],
["SCHEMA_B", [('aa', 2), ('bb', 4), ('cc', 6), ('dd', 8)]],
["SCHEMA_B", [('aa', 3), ('bb', 5), ('cc', 7), ('dd', 9)]]
]
result_1 = get_object_list(data_from_csv)
result_2 = get_object_list_deepcopy(data_from_csv)
print_object_list(result_1)
print_object_list(result_2)
编辑2
架构可能不具有所有属性。所以拆包是行不通的
data_from_csv = [
["SCHEMA_A", [('a', 1), ('b', 2), ('c', 3), ('d', 4)]],
["SCHEMA_B", [('aa', 2), ('bb', 4), ('cc', 6)]],
["SCHEMA_B", [('aa', 3), ('bb', 5), ('cc', 7), ('dd', 9)]]
]
您没有创建类的实例。而是将值写入类对象。您需要创建实例。要初始化对象,请使用:
some_obj = LookUpValues.LOOKUP_DICTIONARY[item[0]](**dict(item[1]))
只要我们讨论的是什么是Pythonic,就不要再将字典包装在无用的类中,并通过类级属性访问它:
LOOKUP_DICTIONARY = {
"SCHEMA_A": SomeClass,
"SCHEMA_B": AnotherClass
}
def get_object_list(csv_data):
obj_list = []
for item in csv_data:
some_obj = LOOKUP_DICTIONARY[item[0]](**dict(item[1]))
obj_list.append(some_obj)
return obj_list
data_from_csv = [
["SCHEMA_A", [('a', 1), ('b', 2), ('c', 3), ('d', 4)]],
["SCHEMA_B", [('aa', 2), ('bb', 4), ('cc', 6), ('dd', 8)]],
["SCHEMA_B", [('aa', 3), ('bb', 5), ('cc', 7), ('dd', 9)]]
]
result_1 = get_object_list(data_from_csv)
在ipython会话中:
In [9]: result_1
Out[9]:
[<__main__.SomeClass at 0x103a5b6a0>,
<__main__.AnotherClass at 0x103a5b710>,
<__main__.AnotherClass at 0x103a5b748>]
In [11]: ob = result_1[0]
In [12]: ob.a, ob.b, ob.c
Out[12]: (1, 2, 3)
In [13]: ob = result_1[1]
In [14]: ob.aa, ob.bb, ob.cc
Out[14]: (2, 4, 6)
In [15]: ob = result_1[2]
In [16]: ob.aa, ob.bb, ob.cc
Out[16]: (3, 5, 7)
[9]中的:结果_1
出[9]:
[,
,
]
[11]中:ob=result_1[0]
在[12]中:ob.a,ob.b,ob.c
Out[12]:(1,2,3)
In[13]:ob=result_1[1]
In[14]:ob.aa,ob.bb,ob.cc
Out[14]:(2,4,6)
In[15]:ob=结果_1[2]
In[16]:ob.aa,ob.bb,ob.cc
Out[16]:(3,5,7)
我想我应该把输出放进去。迭代一=1迭代二=3#在这里,我期望2迭代三=3如果模式没有所有属性,那么如何初始化类?你必须让你的类接受默认参数。谢谢Dan。这确实会抛出太少的参数错误,因为它试图在没有任何参数的情况下初始化对象。想知道解决这一问题的最可行的方法是什么。我的意思是这可以解决问题,但这真的是最好的方法吗?一些对象=LookUpValues.LOOKUP\u DICTIONARY[item[0].\uu新的\uuuu(LookUpValues.LOOKUP\u DICTIONARY[item[0]])
直接使用\uu新的\uuuu
肯定不是pythonic我想我应该澄清一下,在这种情况下你会怎么做?”数据来源:csv=[''模式A',[('A',1),('b',2),('c',3),('d',4)],''模式b',[('aa',2),('bb',4),('cc',6)],''[模式b',[('aa',3),('bb',5),('cc',7),('dd',9)]'''.@dfresh22抱歉,这不正是你上面提到的吗?我只是忘了打印d
和dd
属性……是的,但是所有的“(**dict(项[1])”只是解压列表。@dfresh22否,它使用调用操作符调用类,并通过元组列表传递生成字典的结果,然后使用关键字解压。它起作用了。我已经向您展示了运行上述代码的输出。。。在我最初的回答中,有一个错误的dict(*item)
,这是另一种方法的遗留问题,但上面的方法是书面的。您可以看到我发布的结果。@juanpa.arrivilage您的解决方案确实有效,但并不是所有变量都在元组中。[SCHEMA_B][('aa',2),('bb',4),('cc',6)],
In [9]: result_1
Out[9]:
[<__main__.SomeClass at 0x103a5b6a0>,
<__main__.AnotherClass at 0x103a5b710>,
<__main__.AnotherClass at 0x103a5b748>]
In [11]: ob = result_1[0]
In [12]: ob.a, ob.b, ob.c
Out[12]: (1, 2, 3)
In [13]: ob = result_1[1]
In [14]: ob.aa, ob.bb, ob.cc
Out[14]: (2, 4, 6)
In [15]: ob = result_1[2]
In [16]: ob.aa, ob.bb, ob.cc
Out[16]: (3, 5, 7)