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
?)应该像 属性 的任何其他用户一样通过 属性,除非您有直接访问该属性的特定原因。
我是面向对象编程的新手,我正在努力理解如何在 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
?)应该像 属性 的任何其他用户一样通过 属性,除非您有直接访问该属性的特定原因。