0

我喜欢使用attr并决定阅读一些源代码。引起我注意的一部分是以下(来源):

# 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__

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

4

1 回答 1

1

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

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

于 2020-06-14T03:11:30.940 回答