@property和@value.setter的用法



我对Python中的@property和@value.setter属性有些困惑。我研究了以下网站,我想我理解了基本概念。

https://www.programiz.com/python-programming/property

经过研究,我制作了以下示例程序,它运行良好。但在以下情况下,即使我删除@property和@value.setter,它仍然可以正常工作。那么,当我们在上面两个方法中添加@property和@value.setter时,会有什么不同呢?

#!/usr/bin/python
class TreeNode(object):
def __init__(self):
self._value = None
self._left_node = None
self._right_node = None
@property
def value(self):
return self._value
@value.setter
def value(self, value):
self._value = value
def main():
tree_node = TreeNode()
tree_node.value = 3 
print (tree_node.value)

if __name__ == '__main__':
main()

当您不使用@property@value.setter时,tree_node.value = 3只是替换您以前定义为函数的value属性。由于您的属性只是隐藏了实际变量,所以这两段代码没有任何明显的区别。如果@property函数真的在做一些工作,这种情况就会改变。

例如,您可能希望自动将设置值更改为大于给定值的最小偶数:

class TreeNode(object):
def __init__(self):
self._value = None
self._left_node = None
self._right_node = None
@property
def value(self):
return self._value
@value.setter
def value(self, value):
if value % 2 == 1:
self._value = value + 1
else:
self._value = value
def main():
tree_node = TreeNode()
tree_node.value = 3
print (tree_node.value)

if __name__ == '__main__':
main()

或者你想要两个不同的属性,它们总是相互关联的。

class TreeNode(object):
def __init__(self):
self._value = 0
self._left_node = None
self._right_node = None
@property
def value(self):
return self._value
@property
def value2(self):
return self._value * 2
@value2.setter
def value2(self, value):
self._value = value // 2
@value.setter
def value(self, value):
self._value = value
def main():
tree_node = TreeNode()
tree_node.value = 3
print (tree_node.value)
print (tree_node.value2)

if __name__ == '__main__':
main()

这两个setter函数将确保这些值始终同步。删除上面任何示例中的装饰器都会破坏它们的功能。

@property@value.setter装饰器的目标是在每次访问或设置值时都允许使用特殊的语义,同时保持常规属性的优雅性。

不同之处在于,如果删除@property,则无法执行以下操作(当然可以,但这将是对函数的引用,而不是返回值(:

print(tree_node.value)

因为值将是一个常规方法,必须这样调用:

print(tree_node.value())

最新更新