Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python @property和@value.setter的用法_Python_Properties_Setter - Fatal编程技术网

Python @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

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

在研究了这个之后,我制作了下面的示例程序,它工作得很好。但是在下面的例子中,即使我删除@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将是一个常规方法,必须按如下方式调用:

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
装饰器的目标是在每次访问或设置值时允许使用特殊语义,同时保持常规属性的优雅性