【问题标题】:Why is object.__setattr__.__get__(self, Attribute) used for Attribute's __init__ in attrs/_make.py为什么 object.__setattr__.__get__(self, Attribute) 在 attrs/_make.py 中用于 Attribute 的 __init__
【发布时间】:2023-04-01 22:11:01
【问题描述】:

我喜欢与attr 一起工作,并决定阅读一些源代码。引起我注意的一个部分是以下内容 (source):

# Cache this descriptor here to speed things up later.
bound_setattr = _obj_setattr.__get__(self, Attribute)

# Despite the big red warning, people *do* instantiate `Attribute`
# themselves.
bound_setattr("name", name)
bound_setattr("default", default)
bound_setattr("validator", validator)

其中_obj_setattr 定义为object.__setattr__。

我很好奇为什么要这样做。我已经阅读了this stackoverflow 的响应,发现它非常有用,但它没有涵盖关于__get__ 的部分。我读过一些关于descriptors 的文章,但还没有完全理解它们。所以,我的问题是,为什么要使用_obj_setattr.__get__(self, A)("name", name),而不是object.__setattr__(self, "name", name)?

【问题讨论】:

    标签: python python-descriptors python-attrs


    【解决方案1】:

    调用函数的__get__ 方法会返回一个绑定的方法对象。通常,您通过直接在实例上进行查找来做到这一点,例如self.__setattr__。但此代码预计将用于__setattr__ 方法可能在子类中被覆盖的情况,因此首选直接查找object.__setattr__ 并将其绑定到self。

    虽然你可以做object.__setattr__(self, "name", name) 等等,但每次你使用它时,都会慢一点(因为属性查找不是很快,我们需要object.__setattr__),而且不是很方便,因为我们总是需要手动传递self。将方法绑定到self 会给我们带来更好的性能,而且打字更方便,所以是双赢的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-21
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 2020-05-26
      • 1970-01-01
      相关资源
      最近更新 更多