Python 从字典初始化对象。附加到列表时覆盖值

Python 从字典初始化对象。附加到列表时覆盖值,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

我试图在csv文件中基于模式填充类对象。不需要硬编码任何东西

根据下面的代码,当我将一个对象附加到列表中时,它会覆盖相同类型的前一个对象。我试图专门使用Copy.deepcopy()复制模块,但没有成功

有人能解释一下原因吗?我认为这与我如何从字典中检索类对象并将其附加到列表中有关

从复制导入deepcopy

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)