Python - 构造 Class 属性 - 属性 装饰器 - 奇怪的行为

Python - Construct Class Property - Property Decorator - Strange Behavior

我是面向对象编程的新手,我正在努力理解如何在 class 对象中正确构造 属性。

我遇到了一个有趣的行为,我很难弄明白。

class StepCounter:
    def __init__(self, position: int = 0):
        self.position = position

    @property
    def position(self):
        print('Getting At Work')
        return self._position * 2

    @position.setter
    def position(self, position):
        print('Setter At Work')
        if isinstance(position, int):
            self._position = position * 2
        else:
            raise ValueError('Position Argument must be an integer')

    def timer(self, value: int):
        print(value * self.position)

在 class 对象 StepCounter 中构建 属性 position 之后,我做了以下操作

# 1: set class instance. 'Setter At Work' printed.
step_instance = StepCounter(-3)

# 2: "Getting At Work" printed & returned -12. As expected.
#    -3 as input, setter multiple the input by 2, and getter multiple the value by 2 again.
print(step_instance.position)

# 3: printed -12 as expected. 
step_instance.timer(1)

但是,一旦我将 position 标记为私有属性:

class StepCounter:
    def __init__(self, position: int = 0):
        self._position = position
    ....
    all other codes remain the same

我得到了一些意想不到的东西:

# 1: "Setter At Work" Not Printed
step_instance = StepCounter(-3)

# 2: "Getting At Work" printed & return -6
print(step_instance.position)

# 3: printed -6
step_instance.timer(1)

我的问题是:

1:似乎一旦我将 position 标记为私有属性,setter 就被完全跳过了。为什么会出现这样的行为?

2:似乎在 setter 和 getter 方法中 属性,我们经常使用同名的私有属性。比如self._position = position * 2;那么如果我想在 def __init__() 中将 position 标记为私有,我应该怎么做?

非常感谢您的帮助!

It seems like once I marked position as a private attribute, the setter is completely skipped.

事情就是这样。直接访问属性不以任何方式涉及 属性。

只有 属性 的方法应该直接访问属性。 __init__(和 add_number?)应该像 属性 的任何其他用户一样通过 属性,除非您有直接访问该属性的特定原因。