这对我来说已经有一段时间了,所以我想做的事情可能并不是一件好事,所以我需要解决我的问题或者建议如何做好。
我有一个电子表格,里面有我需要转换的数据。电子表格可以有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个属性,我不希望实例化是静态的,它必须是动态的。
答案 0 :(得分:2)
这样的事情应该有效:
def __init__(self, fields):
for attribute, value in fields.iteritems():
setattr(self, attribute, value)
我完成的所有内容都在参数列表中更改为**kwargs
到fields
(因为您正在传递实际的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
中失败,而第二个方法在调用之前将失败构造函数。