创建具有未知数量的属性

时间:2015-12-22 14:44:42

标签: python class instantiation

这对我来说已经有一段时间了,所以我想做的事情可能并不是一件好事,所以我需要解决我的问题或者建议如何做好。

我有一个电子表格,里面有我需要转换的数据。电子表格可以有140个或更多列,我想让它变为动态,所以如果有人更改了电子表格中的列,它仍然有效。所以我的电子表格可能如下所示:

THISFIELD THATFIELD THIRDFIELD
ABCD 123 文本
EFGH 456 其他文字

等等(男人,在这里制作一张桌子很难!)

这很好用,我猜你知道有一个即将到来的:

class MyThing:
    pass

    def __init__(self, **kwargs):
        for attribute, value in kwargs.iteritems():
            setattr(self, attribute, value)

    def validate_my_thing(self):
        self.ATTRIBUTE = whatever I want to do with that attribute

如果我像这样实例化MyThing:

new_thing = MyThing(THISFIELD="ABCD", THATFIELD=123, THIRDFIELD="Text")

完美无缺。所以问题是我想从电子表格中获取属性名称(我可以做,我不需要知道如何阅读电子表格),并从电子表格中的列填充属性值。如果我可以像这样实例化这个类:

new_thing = Mything({"THISFIELD": "ABCD", "THATFIELD": 123, THIRDFIELD: "TEXT"})
然后我的生活会很轻松。

重新迭代,实例化类如:

new_thing = MyThing(THISFIELD = worksheet_cell(1,2))

不起作用,就像我说可能有140个属性,我不希望实例化是静态的,它必须是动态的。

2 个答案:

答案 0 :(得分:2)

这样的事情应该有效:

def __init__(self, fields):
    for attribute, value in fields.iteritems():
        setattr(self, attribute, value)

我完成的所有内容都在参数列表中更改为**kwargsfields(因为您正在传递实际的dict)。

答案 1 :(得分:1)

将构造函数更改为:

def __init__ (self, fields):
    for attribute, value in fields.items():
        setattr(self, attribute, value)

或者使用**

进行调用
new_thing = Mything(**{"THISFIELD": "ABCD", "THATFIELD": 123, THIRDFIELD: "TEXT"})

注意:如果其中一个键不是有效的属性名称(例如1),则第一个方法将在setattr中失败,而第二个方法在调用之前将失败构造函数。