python - 在 Python 中动态创建类实例

标签 python csv

如何动态生成类实例?具体来说,我想做什么:

我从电子表格中提取数据,然后将其转换为 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/

相关文章:

python - Pandas - 使用包含数组的列展平数据框

python - CSV Python 列表

powershell - 导入Csv,更改1个字段,然后导出

csv - awk 可以处理在引用字段中包含逗号的 CSV 文件吗?

python - Django-Admin 面板不会显示通过 phpmyadmin 插入的记录?

python - 如何在Python中退格 'evaluate'?

python - 如何用 Python 判断字符串是否以数字开头?

python - 分区和 rpartiton 出现 TypeError : 'builtin_function_or_method' object has no attribute '__getitem__'

python - Django 导入 csv HTML

python - 将列表导出到 CSV/空格分隔,每个子列表位于其自己的列中