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

时间:2017-06-05 21:25:42

标签: 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.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'。

1 个答案:

答案 0 :(得分:2)

__init__就像Python中的任何其他方法一样;其中的语句按给定的顺序执行,因此在您的示例代码中,a设置在b之前,c之前设置a, b, c = d, e, f

Python语言规范通常提供比C / C ++等语言更强的排序保证(例如d保证首先读取e,然后f,然后a ,首先设置b,然后设置c,然后设置 Petal.Width Y [,1] [,2] setosa 0.246 0.1053856

它们是属性,普通属性还是其他什么都没关系;赋值可能会做一些时髦的事情,但那些事情按照陈述的顺序发生。