1

我有一堂课property。我也有该属性的设置器。我怎样才能得到绑定的方法property.setter


为什么我要问

使用常规方法,这很容易。一个可以用class_instance.method_name

但是,我很难弄清楚这一点property,因为它返回一个描述符对象。


示例代码

这是写的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
4

1 回答 1

1

在 Python描述符的文档中,您可以在纯 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

换句话说,当您使用属性设置器时,实际上并没有创建绑定方法,因此当绑定方法实际上不存在时,就无法“获取”它。

但是,您可以使用构造函数为给定的未绑定方法(在本例中为property描述符的 setter 属性)创建给定实例的此类绑定方法:SomeClass.some_attr.fsettypes.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
于 2019-12-17T17:33:52.697 回答