无法理解python中的实例变量描述符

无法理解python中的实例变量描述符,python,Python,我正在读这篇文章,几乎没有什么事情是不清楚的 他使用这个密码 class O4(O3): @property # this decorator makes this instancevar into a data descriptor def var(self): return "Data descriptors (such as properties) are high priority" @var.setter # I'll let O3's co

我正在读这篇文章,几乎没有什么事情是不清楚的

他使用这个密码

class O4(O3):
    @property # this decorator makes this instancevar into a data descriptor
    def var(self):
        return "Data descriptors (such as properties) are high priority"

    @var.setter # I'll let O3's constructor set a value in __dict__
    def var(self, value):
        self.__dict__["var"]  = value # but I know it will be ignored
他说@property将任何实例变量转换为数据描述符

  • 现在,它是否意味着它会自动为该变量定义
    \uuuuuu get\uuuuuuu
    \uuuu set\uuuuuuuu
    \uuu del\uuuuuuu
  • 或者@property只相当于
    \uuuu get\uuuu

    我不明白

  • 是否还有其他将实例变量转换为数据描述符的修饰符

  • @var.setter的功能是什么。这也是数据描述符部分吗


  • 如果查看系统上属性装饰器的代码,您将看到它包含三个参数:

    • fget
      :获取变量的函数
    • fset
      :设置变量的函数
    • fdel
      :删除变量的函数
    由于通常使用装饰器装饰单个函数,通常只需定义getter:

    @property
    def my_var(self):
        return self._my_var
    
    如果您还希望声明一个setter,您可以通过
    使用新的“属性”包含一个setter。setter

    @my_var.setter
    def my_var(self, value):
        self._my_var = value
    

    这两者的组合相当于调用
    my\u var=property(get\u my\u var,set\u my\u var)

    如果查看系统上属性装饰器的代码,您会发现它包含三个参数:

    • fget
      :获取变量的函数
    • fset
      :设置变量的函数
    • fdel
      :删除变量的函数
    由于通常使用装饰器装饰单个函数,通常只需定义getter:

    @property
    def my_var(self):
        return self._my_var
    
    如果您还希望声明一个setter,您可以通过
    使用新的“属性”包含一个setter。setter

    @my_var.setter
    def my_var(self, value):
        self._my_var = value
    

    这两者的组合相当于调用
    my\u var=property(get\u my\u var,set\u my\u var)
    @property
    调用
    属性()
    内置项,有关详细信息,请参阅文档

    属性
    只有一个必需参数,即最左边的“getter”。其他的是
    setter
    deleter

    使用带有
    @
    前缀的修饰符只是语法上的糖分。如果您希望以更传统的方式(如果不是音速)调用
    属性


    @property
    调用
    property()
    内置函数,您应该查阅文档以了解该函数的详细信息

    属性
    只有一个必需参数,即最左边的“getter”。其他的是
    setter
    deleter

    使用带有
    @
    前缀的修饰符只是语法上的糖分。如果您希望以更传统的方式(如果不是音速)调用
    属性


    属性
    文档:确保为附加函数指定与原始属性相同的名称。当用作setter时,您的
    set\u my\u var
    将给出AttributeError。您对
    property
    的等效调用也是可疑的,因为您将
    my\u var
    (引用函数)替换为
    property
    的返回值。如果您没有使用装饰器,那么函数名必须与属性名不同。对于decorator,它们都使用相同的名称。虽然覆盖变量的效果很好,但我已将内容更改为更明确:)从
    属性更改为
    doc:确保为附加函数指定与原始属性相同的名称。当用作setter时,您的
    set\u my\u var
    将给出AttributeError。您对
    property
    的等效调用也是可疑的,因为您将
    my\u var
    (引用函数)替换为
    property
    的返回值。如果您没有使用装饰器,那么函数名必须与属性名不同。对于decorator,它们都使用相同的名称。虽然覆盖变量效果很好,但我已将内容更改为更明确的:)