字典词典与类实例的字典

时间:2016-09-27 13:35:33

标签: python class dictionary

我理解一个类是什么,一组属性和方法存储在一个对象中。但是,我不认为我曾经真正掌握了他们的全部力量。我教自己使用词典词典来操纵大量数据。数据结构。我现在在想,如果我想要适应世界其他地方,那么我需要在我的代码中实现类,但我不知道如何进行转换。

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

1)(我目前的方式,将所有订单存储在字典词典中)

cursor.execute(querystring)

# create empty dictionary to hold orders
orders = {}

# define list of columns returned by query
columns = [col[0] for col in cursor.description]

for row in cursor:
    # create dictionary of dictionaries where key is order_id
    # this allows easy access of attributes given the order_id
    orders[row.order_id] = {}
    for i, v in enumerate(columns):
        # add each field to each order
        orders[row.order_id][v] = row[i]

# example operation
for order, fields in orders.iteritems():
    fields['long'], fields['lat'] = getLongLat(fields['post_code'])

# example of another operation
cancelled_orders = getCancelledOrders()
for order_id in cancelled_orders:
    orders[order_id]['status'] = 'cancelled'

# Other similar operations go here...

# write to file here...

2)(我认为如果我使用课程,我会这样做的方式)

class salesOrder():


    def __init__(self, cursor_row):
        for i, v in enumerate(columns):
            setattr(self, v, cursor_row[i])


    def getLongLat(self, long_lat_dict):
        self.long, self.lat = long_lat_dict[self.post_code]['long'], long_lat_dict[self.post_code]['lat']


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


    # more methods here


cursor.execute(querystring)

# create empty dictionary to hold orders
orders = {}

# define list of columns returned by query
columns = [col[0] for col in cursor.description]

for row in cursor:
    orders[row.order_id] = salesOrder(row)
    orders[row.order_id].getLongLat()

# example of another operation
cancelled_orders = getCancelledOrders()
for order_id in cancelled_orders:
    orders[order_id].cancelOrder()

# other similar operations go here

# write to file here

我只是觉得我不太了解使用课程的最佳方式。我对如何使用课程有完全错误的想法吗?对我正在做什么有一些意义,但它需要重构吗?或者我是否试图将课程用于错误的目的?

2 个答案:

答案 0 :(得分:2)

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

你在这里没有做过任何一件事 - 你班上没有真正的行为(它没有对数据做任何事情),以及所有结构是外部提供的。类实例仅用于它们的属性字典,因此它们只是旧字典周围的花哨包装。

如果你添加一些真实的行为(高于getLongLatcancelOrder),或者一些真实的结构(除了传递的任意列名和字段值列表之外)从外面来看,然后使用一个类是有意义的。

答案 1 :(得分:1)

我想猜猜你要做什么,因为我不知道你的"行"好像。我假设你有变量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中列出的所有属性,从row对象创建新的columns对象。初始化SalesOrder对象时,我们也会计算经度和纬度。

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

orders = {row.order_id: SalesOrder(columns, row) for row in cursor}

我们的orders是一个字典,其中order_id为关键字,SalesOrder为值。最后,取消订单的任务与您的代码相同。

除了你所拥有的,我创建了一个名为as_row()的方法,如果以后你想将SalesOrder对象写入CSV或数据库,这个方法很方便。现在,我用它来显示" raw"行。通常,print语句/函数将调用__str__()方法来获取对象的字符串表示,如果没有找到,它将尝试调用__repr__()方法,这就是我们在这里。