python中的@property和@ X.getter有什么区别?

时间:2019-04-24 07:17:22

标签: python python-3.x

我尝试在python文档和其他博客中研究此问题,但找不到满意的答案。所以我们开始。在以下代码中:

class C:
    _x = "Hola"
    @property
    def X(self): return self._x
    @X.getter
    def X(self): return self._x

我知道第一个装饰器@property定义了该属性。 @X.getter在这种情况下是否多余?这两种方法什么时候必要?

3 个答案:

答案 0 :(得分:3)

@property创建一个带有修饰函数的属性作为其getter(并以修饰函数的文档字符串作为其docstring)。

@X.getter(其中X是现有属性)使用旧属性的setter,deleter和docstring创建一个 new 属性,但将修饰后的功能作为其getter

getter主要是为了与setterdeleter对称,它们分别使用新的设置器或删除器创建属性的副本。这些方法的预期用例看起来像

class Whatever:
    @property
    def blah(self):
        "docstring for blah"
        # logic to get property
    @blah.setter(self, value)
        # logic to set property
    @blah.deleter(self)
        # logic to delete property

其中通过使用@blah.setter@blah.deleter用getter,setter和deleter构建属性,并且每个修饰的函数定义都用新的,更完整的属性替换了旧属性。 / p>

您正在做的事情非常不寻常,也没有任何意义。您使用一个吸气剂为X属性创建一个属性,然后使用@X.getter将其替换为具有不同的等效吸气剂的另一个属性(但旧的吸气剂的文档字符串,如果两个getter函数都没有None文档字符串)。这样做是没有意义的。

答案 1 :(得分:-1)

  

在这种情况下,@ X.getter是否多余?这两种方法什么时候必要?

吸气剂是完全多余且不必要的。重新访问X的通常用法是配置设置程序和删除程序,已经通过@property配置了getter。

答案 2 :(得分:-2)

来自the documentation

  

属性对象具有可用作的getter,setter和deleter方法   装饰器,使用相应的属性创建属性的副本   访问器功能设置为修饰功能。这是最好的   举例说明: