【问题标题】:Are properties set in the specified order?属性是否按指定顺序设置?
【发布时间】:2017-11-06 18:12:12
【问题描述】:

假设我有一个具有 3 个实例属性的类,“a”、“b”和“c”,每个属性都使用属性设置器进行初始化。现在,我的属性“b”赋值应该使用实例变量“a”的值。因此,要初始化“b”,必须事先初始化“a”。

按照下面的代码,python 是先设置实例 'a',然后转到实例 'b',最后设置为 'c',或者初始化可能以任何随机顺序发生,这可能会破坏变量初始化成功了吗?

class Foo(object):

    def __init__(self):
        self.a = None
        self.b = None
        self.c = None

    @property
    def a(self):
        return self._a

    @a.setter
    def a(self, value):
        self._a = value

    @property
    def b(self):
        return self._b

    @b.setter
    def b(self, value):
        value = self.a
        self._b = value

    @property
    def c(self):
        return self._c

    @c.setter
    def c(self, value):
        value = self.b
        self._c = value

我在简化版本中问这个问题,因为我在真实案例中遇到了困难。在那种情况下,我使用日志来查看初始化执行的执行情况,在我看来,它从执行最后一个属性(在本例中为“c”)开始,而不是所需的第一个属性“a”。

【问题讨论】:

  • 您可以通过将print 放在每个设置器中来简单地证明这一点 - 是的,设置器按照__init__ 建议的顺序调用。请提供一个minimal reproducible example 来演示实际问题。
  • @jonrsharpe:您只能证明 setter 在您尝试的特定时间按该顺序执行,这并不能证明任何一般性。
  • 我设法找到了导致问题的错误。它实际上不是按照执行顺序,而是在我正在制作的类继承中。第一个答案表明这可以通过打印来查看是正确的。谢谢
  • @user2357112 ^ 实用性胜过纯粹性和认识论;o)
  • @user2357112 dict 确实对它的键进行了排序,只是没有按照您期望的顺序。

标签: python properties initialization


【解决方案1】:

__init__ 与 Python 中的任何其他方法一样;其中的语句按给定的顺序执行,因此在您的示例代码中,a 始终设置在 b 之前,c 之前设置。

Python 语言规范通常提供比 C/C++ 等语言更强大的排序保证(例如,a, b, c = d, e, f 保证首先读取 d,然后读取 e,然后是 f,然后首先设置 a ,然后是b,然后是c)。

无论它们是属性、普通属性还是其他任何东西都没有关系;赋值可能会做一些奇怪的事情,但这些事情是按照语句发生的顺序发生的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 2016-09-07
    相关资源
    最近更新 更多