如何动态生成类实例?具体来说,我想做什么:
我从电子表格中提取数据,然后将其转换为 CSV。该行是标题。在标题行之后,每一行代表有关特定订单的数据(col1 是订单 ID,col2 是客户名称,col 3 是日期,col 4 是数量,等等)。现在,我正在将 CSV 导入到字典列表中。因此,列表中的每个项目都存储了一个从标题行中提取键的字典。因此,我可以通过以下方式查找订单 #5 的数量:
orderDict[5]['quantity']
我对面向对象的编程还很陌生……但我想让这些订单中的每一个都成为 Order 类的一个实例。所以,我想创建一个名为“Order”的类,然后让它从 CSV 的标题行中提取属性。因此,类似于(inputList 是从 CSV 文件中提取的列表):
class Order(object):
"""Defines an individual order"""
def __init__(self, inputList):
for z in range(len(inputList[0]))
self.inputList[0][z] = None
然后我想要一些代码来处理从 CSV 导入的数据并为每一行创建一个实例。
for a in range(len(inputList))
if a != 0:
orderName = 'order%d' % (a)
orderName = Order() #I know this won't work... but not sure how I variably name this
for b in range(len(inputList[a]))
orderName.b = inputList[a][b]
结果将是一个名为 order1、order2、order3、order4 等的实例。创建的实例数将取决于原始数据中的行数。可能是 4... 可能是数千。
这样,如果我想找到订单 5 的数量,我可以调用:
order5.quantity
但是,到目前为止,我似乎需要手动显式创建每个实例:
order1 = Order()
order2 = Order()
order3 = Order()
在处理数以千计的订单(并且还在增长)时不是很方便或动态。似乎应该有一种方法可以根据输入程序的数据动态生成这些实例。
最佳答案
如果您真的希望实例具有全局变量名称(例如 order1、order2 等),则可以(但非常难看)使用例如globals()['order' + num] = Order(...)
。更清洁和更安全的方法是将实例存储在一个字典中。同样为了提高效率,您可以弹出标题以避免每次迭代都对零进行测试,可以使用 xrange 而不是 range 来避免吞噬周围的完整数据集,可以选择在对象的 init 中而不是之后设置属性(看到信息已经可用......),并且可以只将标题和行传递给每个实例化而不是所有数据。顺便说一下,您的 for 行末尾缺少冒号:
class Order(object):
"""Defines an individual order"""
def __init__(self, input_header, input_line):
for z in xrange(len(input_header)):
setattr(self, input_header[z], input_line[z])
orders = {}
input_header = input_list.pop(0)
for a in xrange(len(input_list)):
orders[a] = Order(input_header, input_list[a])
关于python - 在 Python 中动态创建类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20320024/