我理解一个类是什么,一组属性和方法存储在一个对象中。但是,我不认为我曾经真正掌握了他们的全部力量。我教自己使用词典词典来操纵大量数据。数据结构。我现在在想,如果我想要适应世界其他地方,那么我需要在我的代码中实现类,但我不知道如何进行转换。
我有一个脚本,它从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
我只是觉得我不太了解使用课程的最佳方式。我对如何使用课程有完全错误的想法吗?对我正在做什么有一些意义,但它需要重构吗?或者我是否试图将课程用于错误的目的?
答案 0 :(得分:2)
类通常用于将数据耦合到行为,以及用于提供结构(例如,命名和记录某些属性的关联)。
你在这里没有做过任何一件事 - 你班上没有真正的行为(它没有对数据做任何事情),以及所有结构是外部提供的。类实例仅用于它们的属性字典,因此它们只是旧字典周围的花哨包装。
如果你做添加一些真实的行为(高于getLongLat
和cancelOrder
),或者一些真实的结构(除了传递的任意列名和字段值列表之外)从外面来看,然后使用一个类是有意义的。
答案 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__()
方法,这就是我们在这里。