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

标签 python properties attributes python-descriptors

我有一个具有一个属性的类。我也有一个该属性的 setter 。如何获取 property.setter 的绑定(bind)方法?

<小时/>

我为什么问

使用常规方法,这很容易。可以只使用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

最佳答案

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

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

换句话说,当您使用属性 setter 时,实际上并没有创建绑定(bind)方法,因此当绑定(bind)方法实际上不存在时,无法“获取”该方法。

但是,您可以为给定的未绑定(bind)方法创建给定实例的绑定(bind)方法,在本例中为 property 描述符的 setter 属性,SomeClass.some_attr.fset,使用 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

关于Python如何获取某些property.setter的绑定(bind)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59330677/

相关文章:

javascript - d3 用一个函数设置多个属性

python - 如何使图像亮度均匀(使用 Python/PIL)

python - 使用 docopt 不带 -h 显示完整的文档字符串

c# - 如何使属性知道它所在的属性的名称?

c# - 在自己的构造函数中初始化一个新类

java - 使用java从属性文件中删除键和值

objective-c - 有什么方法可以标记一个 c 函数或 obj-c 方法以在运行时识别它吗?

python - 如何在每个单词后的文本文件中添加换行符

Python:set.difference 和 set.difference_update 有什么区别?

properties - Kotlin 抽象 protected 属性(property)