Python 属性是否按指定顺序设置?

Python 属性是否按指定顺序设置?,python,properties,initialization,Python,Properties,Initialization,假设我有一个具有3个实例属性“a”、“b”和“c”的类,每个实例属性都用属性设置器初始化。现在,我的属性'b'赋值应该使用实例变量'a'的值。因此,要初始化“b”,必须事先初始化“a” 按照下面的代码,python是先设置实例“a”,然后再设置实例“b”,最后再设置实例“c”,还是以任意随机顺序进行初始化,这可能会破坏成功初始化变量的可能性 class Foo(object): def __init__(self): self.a = None self

假设我有一个具有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”。

\uuuu init\uuu
与Python中的任何其他方法类似;其中的语句是按照给定的顺序执行的,因此在示例代码中,
a
设置在
b
之前,而
c
之前总是设置

Python语言规范通常比C/C++等语言提供了更强的排序保证(例如,
a、b、C=d、e、f
保证先读取
d
,然后读取
e
,然后读取
f
,并且先设置
a
,然后设置
b
,然后读取
C


不管它们是属性、普通属性还是其他属性;赋值可能会做一些奇怪的事情,但这些事情是按照语句发生的顺序发生的。

您可以通过在每个setter中放入
print
来演示这一点-是的,setter是按照
\uuuu init\uuuuu
建议的顺序调用的。请给出一个例子来说明实际的问题。@jonrsharpe:您只能证明setters在您尝试它的特定时间内按该顺序执行,这不能证明任何一般性。我设法找到了导致问题的错误。它实际上并不是按照执行的顺序,而是按照我正在进行的类继承。第一个答案是正确的,它表明这可以通过打印查看。感谢you@user2357112实用性优于单纯性和会阴学;o) @user2357112
dict
会对其键进行排序,只是没有按照您期望的顺序排序。