我已经trying岁了,能够理解Python的描述符是什么,它们的用途是什么.我理解它们是如何工作的,但我对此表示怀疑.考虑下面的代码:

class Celsius(object):
    def __init__(self, value=0.0):
        self.value = float(value)
    def __get__(self, instance, owner):
        return self.value
    def __set__(self, instance, value):
        self.value = float(value)


class Temperature(object):
    celsius = Celsius()
  1. 为什么我需要描述符类?

  2. 这里的instanceowner是什么?(第__get__号).这些参数的用途是什么?

  3. 我该如何称呼/使用这个例子?

推荐答案

描述符是Python的property类型的实现方式.描述符只是实现__get____set__等,然后被添加到其定义中的另一个类中(就像上面对Temperature类所做的那样).例如:

temp=Temperature()
temp.celsius #calls celsius.__get__

访问为其分配描述符的属性(上例中为celsius)将调用相应的描述符方法.

__get__中的instance是类的实例(如上所述,__get__将接收temp,而owner是带有描述符的类(因此将是Temperature).

您需要使用一个描述符类来封装驱动它的逻辑.这样,如果描述符用于缓存一些昂贵的操作(例如),它可以将值存储在自己而不是它的类上.

一篇关于描述符的文章可以在here页找到.

编辑:正如jchl在 comments 中指出的那样,如果你简单地try Temperature.celsiusinstance将是None.

Python相关问答推荐

如何在polars(pythonapi)中解构嵌套 struct ?

Python库:可选地支持numpy类型,而不依赖于numpy

Polars:用氨纶的其他部分替换氨纶的部分

Python解析整数格式说明符的规则?

如何使用表达式将字符串解压缩到Polars DataFrame中的多个列中?

Pandas:将多级列名改为一级

如何在WSL2中更新Python到最新版本(3.12.2)?

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

组/群集按字符串中的子字符串或子字符串中的字符串轮询数据框

合并帧,但不按合并键排序

如何在BeautifulSoup/CSS Select 器中处理regex?

在输入行运行时停止代码

跳过嵌套JSON中的级别并转换为Pandas Rame

为什么t sns.barplot图例不显示所有值?'

GPT python SDK引入了大量开销/错误超时

Python将一个列值分割成多个列,并保持其余列相同

通过对列的其余部分进行采样,在Polars DataFrame中填充_null`?

我的浮点问题--在C++/Python中的试用

将COLUMN BY GROUP中的值连接为列表,并将其赋值给PANAS数据框中的变量

使用极轴 Select 一系列柱