@property和@ value.setter的用法

时间:2018-12-02 07:22:22

标签: python properties setter

我对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')

2 个答案:

答案 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())