Python @property属性何时被评估?

7

这是一段代码片段。

class TestClass:
    def __init__(self):
        self.a = "a"
        print("calling init")

    @property
    def b(self):
        b = "b"
        print("in property")
        return b

test_obj = TestClass()
print("a = {} b = {}".format(test_obj.a,test_obj.b))

我试图理解test_obj内定义的变量b何时获得其值"b"。
从下面的屏幕截图中可以看出,尽管第13行语句尚未被评估/执行,但test_obj的b值已经被初始化。通过在每一行上放置断点来调试这个问题并没有帮助我理解这是如何发生的。 enter image description here 有人能解释一下吗?

2
这可能是特定于IDE正在执行的操作,而不是Python本身。该方法将在访问TestClass实例的b属性时被调用,但看起来IDE正在后台为调试器输出执行此操作。 - jonrsharpe
1
只有在访问该属性时,函数b中的代码才会运行。例如,如果b引发异常,则在特定访问test_obj.b之前,您的代码将正常运行。 - 101
1个回答

8
更有可能的是,IDE试图向您展示test_obj.b的值。为此,它会从test_obj.b中获取值。由于b是属性还是@property并没有太大区别,因此调试器基本上只是为您执行test_obj.b,这将使其获得值'b'
函数def b与任何其他普通函数一样正常工作;只是调试器/IDE会隐式地为您调用它。

因此,仅在每次调用时才会检索test_obj.b的值,在这段代码片段中,它只在第13行调用一次,对吗? - Dhiwakar Ravikumar
2
是的,在没有调试器的情况下,那个值在那个时候还不存在。 - deceze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接