Python 字典字典vs类实例字典

Python 字典字典vs类实例字典,python,class,dictionary,Python,Class,Dictionary,我理解什么是类,是存储在一个对象中的一组属性和方法。然而,我认为我从未真正掌握过他们的全部力量。我自学了使用“字典中的字典”数据结构来处理大量数据。我现在在想,如果我想融入世界其他地方,那么我需要在代码中实现类,但我不知道如何进行转换 我有一个脚本,它从SQL查询中获取有关销售订单的信息,对数据执行操作,并将其输出到csv 1) (按照我目前的做法,将所有订单存储在字典字典中) 2) (如果我使用类,我认为我会这样做) 我只是觉得我不太了解使用类的最佳方式。我对如何使用类有完全错误的想法吗?我正

我理解什么是类,是存储在一个对象中的一组属性和方法。然而,我认为我从未真正掌握过他们的全部力量。我自学了使用“字典中的字典”数据结构来处理大量数据。我现在在想,如果我想融入世界其他地方,那么我需要在代码中实现类,但我不知道如何进行转换

我有一个脚本,它从SQL查询中获取有关销售订单的信息,对数据执行操作,并将其输出到csv

1) (按照我目前的做法,将所有订单存储在字典字典中)

2) (如果我使用类,我认为我会这样做)


我只是觉得我不太了解使用类的最佳方式。我对如何使用类有完全错误的想法吗?我正在做的事情是否有些道理,但它需要重构?还是我试图将类用于错误的目的?

我试图猜测您想做什么,因为我不知道您的“行”是什么样子。我假设您有变量
columns
,它是一个列名列表。如果是这样的话,请考虑这个代码片段:

class SalesOrder(object):
    def __init__(self, columns, row):
        """ Transfer all the columns from row to this object """
        for name in columns:
            value = getattr(row, name)
            setattr(self, name, value)
        self.long, self.lat = getLongLat(self.post_code)

    def cancel(self):
        self.status = 'cancelled'

    def as_row(self):
        return [getattr(self, name) for name in columns]

    def __repr__(self):
        return repr(self.as_row())

# Create the dictionary of class
orders = {row.order_id: SalesOrder(columns, row) for row in cursor}

# Cancel
cancelled_orders = getCancelledOrders()
for order_id in cancelled_orders:
    orders[order_id].cancel()

# Print all sales orders
for sales_order in orders.itervalues():
    print(sales_order)
在最低级别,我们需要能够通过复制
列中列出的所有属性,从
对象创建一个新的
SalesOrder
对象。初始化
SalesOrder
对象时,我们还计算经度和纬度

这样,创建类对象字典的任务就变得更容易了:

orders = {row.order_id: SalesOrder(columns, row) for row in cursor}
我们的
orders
是一本字典,其中
order\u id
作为键,
SalesOrder
作为值。最后,取消订单的任务与代码相同


除了您所拥有的之外,我还创建了一个名为
as_row()
的方法,如果以后您希望将
SalesOrder
对象写入CSV或数据库,该方法非常方便。现在,我使用它来显示“原始”行。通常,
print
语句/函数将调用
\uuu str\uuu()
方法来获取对象的字符串表示,如果找不到,它将尝试调用
\uu repr\uuu()
方法,这就是我们这里的方法。

类对于将数据耦合到行为以及提供结构非常有用(例如,命名和记录某些属性的关联)

这里你没有做这两件事——在你的类中没有真正的行为(它对数据没有任何作用),所有的结构都是外部提供的。类实例只是用于它们的属性字典,所以它们只是旧字典的一个奇特的包装器


如果您确实添加了一些真实的行为(在
getLongLat
cancelOrder
上面),或者一些真实的结构(除了从外部传入的任意列名和字段值的列表),那么使用类是有意义的。

将类看作是一个具有自定义方法的字典在第一个示例中,您的
似乎是一个类对象(例如
行.顺序id
)。(b)
行.列
将不起作用。(c)让我们备份一点,我认为你将数据放入字典的原因是很容易查找,然后更新。然而,这就是你的数据库的用途,为什么不查询数据库并直接更新?@HaiVu(a)行是一个类对象,但它只是光标返回的一行,我了解如何使用现有类(大部分),我更关心的是实现我自己的类的最佳方法(b)row.column上的好点,我的坏点,这就是为什么我在第二个示例中使用enumerate(columns)来解决这个问题,我现在编辑问题(c)在给定的情况下,这将是一种更好的方法,但出于问题的目的,我已经简化了问题,纯db解决方案不一定适合我更广泛的项目(希望有意义)好的,部分原因是您可以将dbcol attrib映射放在DBInst类中的方法dbset中。然后SalesOrder可以是该方法的一个子类,并从init.Presto调用dbsetb,整个db感知类。您好,这非常有帮助。它给了我一些关于如何更好地构造代码的想法,它还向我保证了我尝试使用的方法同一类的多个实例是类的“有效”使用。顺便说一句,“columns”变量只是我在sql查询中选择的字段列表。如果要保留通过顺序括号引用嵌套项的功能,请参阅
class SalesOrder(object):
    def __init__(self, columns, row):
        """ Transfer all the columns from row to this object """
        for name in columns:
            value = getattr(row, name)
            setattr(self, name, value)
        self.long, self.lat = getLongLat(self.post_code)

    def cancel(self):
        self.status = 'cancelled'

    def as_row(self):
        return [getattr(self, name) for name in columns]

    def __repr__(self):
        return repr(self.as_row())

# Create the dictionary of class
orders = {row.order_id: SalesOrder(columns, row) for row in cursor}

# Cancel
cancelled_orders = getCancelledOrders()
for order_id in cancelled_orders:
    orders[order_id].cancel()

# Print all sales orders
for sales_order in orders.itervalues():
    print(sales_order)
orders = {row.order_id: SalesOrder(columns, row) for row in cursor}