Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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中属性装饰器对可变属性的有用性_Python_Oop_Properties - Fatal编程技术网

python中属性装饰器对可变属性的有用性

python中属性装饰器对可变属性的有用性,python,oop,properties,Python,Oop,Properties,当我们需要能够设置属性时,尝试理解Python中属性的好处。明确查看这两种技术的优缺点 在Python中使用@prop.setter的@property有哪些好处: class Foo2: def __init__(self, prop): self.prop = prop @property def prop(self): return self._prop @prop.setter def prop(self, v

当我们需要能够设置属性时,尝试理解Python中属性的好处。明确查看这两种技术的优缺点

在Python中使用@prop.setter的@property有哪些好处:

class Foo2:

    def __init__(self, prop):
        self.prop = prop

    @property
    def prop(self):
        return self._prop

    @prop.setter
    def prop(self, value):
        self._prop = value
与只设置属性而不使用属性装饰器相比

class Foo:
    def __init__(self, prop):
        self.prop = prop

您创建了一个无法删除的属性:

>>> f = Foo('bar')
>>> f.prop
'bar'
>>> del f.prop
>>> f.prop
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'prop'
除此之外,或者如果您添加了一个
@prop.deleter
处理程序,那么创建这样的属性实际上没有任何好处。将普通属性访问可以做的事情委托给函数并没有那么有用

属性设置器或getter在执行除设置属性之外的其他操作(如验证或转换)时更有用

例如,setter可以强制值始终为整数,包括在转换为整数失败时设置默认值:

@prop.setter
def prop(self, value):
    try:
        self._prop = int(prop)
    except ValueError:
        self._prop = 0

在其他编程语言(如Java)中,您无法轻松地将属性转换为getter和setter(Java中没有与Python属性等效的概念),而不必在代码库中的任何地方重新编写对这些属性的所有访问权限,因此在这些语言中,您经常看到从getter和setter开始的建议这不适用于Python,您可以轻松地将现有属性转换为属性,而无需更改使用这些属性的任何代码。

您创建了一个无法删除的属性:

>>> f = Foo('bar')
>>> f.prop
'bar'
>>> del f.prop
>>> f.prop
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'prop'
除此之外,或者如果您添加了一个
@prop.deleter
处理程序,那么创建这样的属性实际上没有任何好处。将普通属性访问可以做的事情委托给函数并没有那么有用

属性设置器或getter在执行除设置属性之外的其他操作(如验证或转换)时更有用

例如,setter可以强制值始终为整数,包括在转换为整数失败时设置默认值:

@prop.setter
def prop(self, value):
    try:
        self._prop = int(prop)
    except ValueError:
        self._prop = 0
在其他编程语言(如Java)中,您无法轻松地将属性转换为getter和setter(Java中没有与Python属性等效的概念),而不必在代码库中的任何地方重新编写对这些属性的所有访问权限,因此在这些语言中,您经常看到从getter和setter开始的建议这不适用于Python,您可以轻松地将现有属性转换为属性,而无需更改使用这些属性的任何代码。

可能重复的