我目前正在开发几个涉及数据处理,存储和Web界面的Python包。
为了将存储的数据(在数据库中)链接到Web界面,我当前正在使用表示通过所有这些包使用的数据的类。因此,这些类包含从数据库加载和转换原始数据,转换回并保存在数据库中的方法,以及特定于数据所代表的概念类型的处理方法。
我想将这些类分解为更加隔离的方法。例如,一方面,数据模型类包含数据库中包含的原始数据,另一方面基于原始数据(数据模型类的实例)的类来执行专题工作。
为了说明我的情况,让我们考虑一个包含表格的数据库" localized_event"字段是: - 日期(作为unix时间标签,整数) - 纬度(作为浮点值) - 经度(作为浮点值)
我现在拥有的是一个能够从原始数据加载的单个类( from_dict 方法),生成SQL来保存( sql_insert 方法)但仍然为用户提供进化的属性( datetime 等):
from dummy_geo_module import LatLon
from datetime import datetime
from datetime import timedelta
...
class LocalizedEvent(object):
def __init__(self, date_event, latitude, longitude):
if isinstance(self.start_validity, int):
self.date_event = datetime.utcfromtimestamp(0) + timedelta(seconds=timestamp)
else:
self.date_event = date_event
self.geo_coord = LatLon(latitude, longitude)
@classmethod
def from_dict(cls, dict):
return cls(None if 'date_event' not in dict.keys() else dict['date_event'],
None if 'latitude' not in dict.keys() else dict['latitude'],
None if 'longitude' not in dict.keys() else dict['longitude'])
def sql_insert(self, table):
query = 'INSERT OR IGNORE INTO ' + table + ' ' + '(date_event, latitude, longitude) VALUES ?, ?, ?'
return query, self.get_table_tuple()
def get_table_tuple(self):
return (int((self.date_event - datetime(1970, 1, 1)) / timedelta(seconds=1)),
self.geo_coord.lat,
self.geo_coord.lon,)
...
分割这个类似乎很好,(i)与数据库交互的数据模型类:
class LocalizedEventData(object):
def __init__(self, date_event, latitude, longitude):
self.date_event = date_event
self.latitude = latitude
self.longitude = longitude
@classmethod
def from_dict(cls, dict):
return cls(None if 'date_event' not in dict.keys() else dict['date_event'],
None if 'latitude' not in dict.keys() else dict['latitude'],
None if 'longitude' not in dict.keys() else dict['longitude'])
def sql_insert(self, table):
query = 'INSERT OR IGNORE INTO ' + table + ' ' + '(date_event, latitude, longitude) VALUES ?, ?, ?'
return query, (self.date_event, self.latitude, self.longitude)
...
和(ii)用于处理的类(使用演化属性和任何类型的方法)等。
from dummy_geo_module import LatLon
from datetime import datetime
from datetime import timedelta
...
class LocalizedEvent(object):
def __init__(self, locevt_data):
self.date_event = datetime.utcfromtimestamp(0) + timedelta(seconds=locevt_data.timetag_event)
self.geo_coord = LatLon(locevt_data.latitude, locevt_data.longitude)
...
有关此类设计的最佳做法的任何建议吗?