我有dict形式的数据(通过PyMongo从MongoDB数据库获得),比如:
car = {_id: "1", "color": "silver", "steering_wheel":"2"}
其中“steering_wheel”的值是我的数据库中另一个文档的id,它表示SteeringWheel类的实例。从DB加载到Python将导致:
^{pr2}$为了处理数据,我使用Python类。现在,我的问题是关于延迟加载。我可以想出两种方法:
1)保留被引用的id并创建另一个仅用于运行时的属性,用于直接访问被引用对象:
class Car(object):
def __init__(self, _id, color, steering_wheel_ref_id, session):
self._id = _id
self.color = color
self.steering_wheel_ref_id = steering_wheel_ref_id
self.session = session
@property
def steering_wheel(self):
try:
return self.steering_wheel
except AttributeError:
# Get the referecend object from the session
self.steering_wheel = self.session.resolve_item_refs(self.steering_wheel_ref_id)
return self.steering_wheel
2)另一种选择是执行类型检查:
class Car(object):
def __init__(self, _id, color, steering_wheel, session):
self._id = _id
self.color = color
self.steering_wheel = steering_wheel
self.session = session
@property
def steering_wheel(self):
if isinstance(self.steering_wheel, SteeringWheel):
return self.steering_wheel
else:
# Get the referecend object from the session
self.steering_wheel = self.session.resolve_item_refs(self.steering_wheel_ref_id)
return self.steering_wheel
你喜欢哪条路?或者,有没有更好的方法/最佳实践来解决通过id访问引用的问题?在
虽然一般来说它是EAFP,但这不适用于它创建冗余的地方,IMO
所以:
说到冗余。。。如果我们要经常这样做,也许我们应该在它自己的代理类中封装这个逻辑:
^{pr2}$差不多吧。在
这个怎么样?在
如果我必须在你的两种方法中选择一种,我会选择第一种。从使用duck类型(即“Python方式”)的角度来看,它更像Python。在
第二个更难阅读和理解。在
至于其他的建议,对不起,我什么也没有。:-)
相关问题 更多 >
编程相关推荐