python变量引用意外改变行为

时间:2017-07-11 13:14:26

标签: python django

我想了解这种完全出乎意料的行为变化的原因以及如何实施。我来自JS世界,这很可能无法以任何方式实现..

通过遍历对象来调用fn会得到与首次将此对象分配给新变量时不同的结果:

>>> from core.models import SomeModel
>>> s = SomeModel.objects.get(id=45)
>>> s.user.profile.needs_review
True
>>> s.user.profile.needs_review = False
>>> s.user.profile.needs_review
True
>>> profile = s.user.profile
>>> profile.needs_review
True
>>> profile.needs_review = False
>>> profile.needs_review
False

这真的令人不安,因为在任何与我合作过的语言中都会这样做。

顺便说一句,这是一个常规的django模型,但我更有兴趣知道可以使用哪种语言资源来实现这种效果。

为了更好地解释我为什么会这样做,我试图通过以下方式对profile模型进行常规保存:

streamer.user.profile.needs_review = True
streamer.user.profile.save()

它并没有奏效,但正在做:

profile = streamer.user.profile
profile.needs_review = True
profile.save()

工作得很好。

2 个答案:

答案 0 :(得分:1)

如果对模型对象进行更改,则必须保存模型对象,否则无法反映。

>>> s.user.profile.needs_review = False
>>> s.save()
>>> s.user.profile.needs_review
False

以下一行

>>> profile = s.user.profile
>>> profile.needs_review
True

它不会从数据库加载新数据这就是您看到此行为的原因

答案 1 :(得分:1)

关于允许此行为的python语言资源,您可以检查:
https://docs.python.org/3/library/functions.html#property

class C:
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

    @x.deleter
    def x(self):
        del self._x

基本上,django使用它来抽象数据库查询,并且在示例中不像常规对象那样。