创建 class 个具有未知数量属性的实例

Create class instance with unknown number of attributes

这已经困扰我一段时间了,所以我尝试做的事情可能不是一件好事,所以我需要解决我的问题或建议如何正确地做。

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

THISFIELDTHATFIELDTHIRDFIELD
ABCD 123 文本
EFGH 456 其他文字

等(伙计,在这里制作 table 太难了!)

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

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")

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

new_thing = Mything({"THISFIELD": "ABCD", "THATFIELD": 123, THIRDFIELD: "TEXT"})

那我的生活就轻松了

只是为了重新迭代,实例化 class 如:

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

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

像这样的东西应该可以工作:

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

我所做的只是在参数列表中将 **kwargs 更改为 fields(因为您传递的是实际的 dict)。

要么将构造函数更改为:

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中失败,而second 将在调用构造函数之前失败。