Python如何获取某些property.setter的绑定方法

Python how to get bound method of some property.setter

我有一个 class 和一个 property。 属性 我也有一个 setter。如何获取 property.setter 的绑定方法?


我为什么要问

用正常的方法,这很容易。可以只使用 class_instance.method_name.

但是,我很难为 property 解决这个问题,因为它 returns 是一个描述符对象。


示例代码

这是用Python 3.6写的:

class SomeClass:
    def __init__(self):
        self._some_attr = 0

    @property
    def some_attr(self) -> int:
        return self._some_attr

    # How can I get this bound method?
    @some_attr.setter
    def some_attr(self, val: int) -> None:
        self._some_attr = val

    def normal_method(self, val: int) -> None:
        self.some_attr = val


if __name__ == "__main__":
    some_class = SomeClass()
    print(some_class.some_attr)  # prints: 0
    print(some_class.normal_method)  # prints: bound method SomeClass.normal_method

在 Python descriptor 的文档中,您可以在纯 Python 中找到 property 描述符的等效实现,其中 setter 方法只需使用给定的对象和目标值调用未绑定的方法:

def __set__(self, obj, value):
    if self.fset is None:
        raise AttributeError("can't set attribute")
    self.fset(obj, value) # unbound method called

换句话说,当你使用 属性 setter 时,实际上并没有创建绑定方法,所以没有办法 "get" 当绑定方法实际上不存在时.

但是,您可以为给定的未绑定方法创建给定实例的绑定方法,在本例中为 property 描述符 SomeClass.some_attr.fset 的 setter 属性,使用types.MethodType 构造函数:

from types import MethodType

some_class = SomeClass()
f = MethodType(SomeClass.some_attr.fset, some_class)
print(f)
f(2) # calls the bound setter method, equivalent to: some_class.some_attr = 2
print(some_class.some_attr)

这输出:

<bound method SomeClass.some_attr of <__main__.SomeClass object at 0x0000015C3CCB74C0>>
2