Python @property和@value.setter的用法
我对Python中的@property和@value.setter属性有些困惑。 我研究了以下网站,我想我理解了基本概念 在研究了这个之后,我制作了下面的示例程序,它工作得很好。但是在下面的例子中,即使我删除@property和@value.setter,它仍然可以正常工作。那么,当我们在上述两个方法中添加@property和@value.setter时,会有什么不同呢Python @property和@value.setter的用法,python,properties,setter,Python,Properties,Setter,我对Python中的@property和@value.setter属性有些困惑。 我研究了以下网站,我想我理解了基本概念 在研究了这个之后,我制作了下面的示例程序,它工作得很好。但是在下面的例子中,即使我删除@property和@value.setter,它仍然可以正常工作。那么,当我们在上述两个方法中添加@property和@value.setter时,会有什么不同呢 #!/usr/bin/python class TreeNode(object): def __init__(se
#!/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将是一个常规方法,必须按如下方式调用:
print(tree_node.value())
不同之处在于,如果删除
@property
,则无法执行以下操作(当然可以,但这将是对函数的引用,而不是返回值):
因为value将是一个常规方法,必须按如下方式调用:
print(tree_node.value())
当您不使用
@property
和@value.setter
时,tree\u 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
和@value.setter
时,tree\u 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
装饰器的目标是在每次访问或设置值时允许使用特殊语义,同时保持常规属性的优雅性