我对Python中的@property和@ value.setter属性有些困惑。 我研究了以下网站,我认为我了解基本概念。
https://www.programiz.com/python-programming/property
研究了此内容之后,我制作了以下示例程序,它运行正常。但是在以下情况下,即使删除了@property和@ value.setter,它仍然可以正常工作。那么,当我们在两种方法之上添加@property和@ value.setter时,会有什么不同?
import re
user_input = raw_input('Please enter password:')
if len(user_input)>=6 and user_input[0].isalpha() and re.match(r"^[\w-]*$", user_input):
print('Yes')
else:
print('No')
答案 0 :(得分:3)
当您不使用@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()
两个设置器功能将确保值始终保持同步。 在以上任何示例中删除装饰器都会破坏其功能。
@property
和@value.setter
装饰器的目标是在每次访问或设置值时都允许特殊的语义,同时保持常规属性的优雅。
答案 1 :(得分:1)
区别在于,如果删除@property
,则无法执行以下操作(可以,但是可以引用该函数,而不是返回值):
print(tree_node.value)
因为值将是常规方法,因此必须像这样调用:
print(tree_node.value())