我已经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相关问答推荐

使用@ guardlasses. guardlass和注释的Python继承

将pandas Dataframe转换为3D numpy矩阵

OR—Tools中CP—SAT求解器的IntVar设置值

迭代嵌套字典的值

如何在UserSerializer中添加显式字段?

计算天数

dask无groupby(ddf. agg([min,max])?''''

OpenGL仅渲染第二个三角形,第一个三角形不可见

使用__json__的 pyramid 在客户端返回意外格式

如果有2个或3个,则从pandas列中删除空格

BeautifulSoup-Screper有时运行得很好,很健壮--但有时它失败了::可能这里需要一些更多的异常处理?

我可以不带视频系统的pygame,只用于游戏手柄输入吗?''

Pandas:计数器的滚动和,复位

我怎么才能用拉夫分拣呢?

对于标准的原始类型注释,从键入`和`从www.example.com `?

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

对包含JSON列的DataFrame进行分组

判断字典键、值对是否满足用户定义的搜索条件

matplotlib散点图与NaNs和cmap colored颜色 矩阵

Pandas:根据系列词典中的值筛选行