创建 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 将在调用构造函数之前失败。
这已经困扰我一段时间了,所以我尝试做的事情可能不是一件好事,所以我需要解决我的问题或建议如何正确地做。
我有一个电子表格,里面装满了我需要转换的数据。电子表格可以有 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 将在调用构造函数之前失败。