Python延迟加载模式

2024-10-01 11:29:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有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访问引用的问题?在


Tags: the数据方法selfrefid数据库return
3条回答

虽然一般来说它是EAFP,但这不适用于它创建冗余的地方,IMO

所以:

@property
def steering_wheel(self):
if not hasattr(self, 'steering_wheel'):
    self.steering_wheel = self.session.resolve_item_refs(self.steering_wheel_ref_id)
    # And while we're at it, maybe a bit of housekeeping?
    del self.steering_wheel_ref_id
return self.steering_wheel

说到冗余。。。如果我们要经常这样做,也许我们应该在它自己的代理类中封装这个逻辑:

^{pr2}$

差不多吧。在

这个怎么样?在

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
        self._steering_wheel = None

    @property
    def steering_wheel(self):
        if self._steering_wheel is None:
            # Get the referecend object from the session 
            self._steering_wheel = self.session.resolve_item_refs(self.steering_wheel_ref_id)
        return self._steering_wheel

如果我必须在你的两种方法中选择一种,我会选择第一种。从使用duck类型(即“Python方式”)的角度来看,它更像Python。在

第二个更难阅读和理解。在

至于其他的建议,对不起,我什么也没有。:-)

相关问题 更多 >