【发布时间】: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