Python 属性是否按指定顺序设置?
假设我有一个具有3个实例属性“a”、“b”和“c”的类,每个实例属性都用属性设置器初始化。现在,我的属性'b'赋值应该使用实例变量'a'的值。因此,要初始化“b”,必须事先初始化“a” 按照下面的代码,python是先设置实例“a”,然后再设置实例“b”,最后再设置实例“c”,还是以任意随机顺序进行初始化,这可能会破坏成功初始化变量的可能性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
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) @user2357112dict
会对其键进行排序,只是没有按照您期望的顺序排序。