我有一个具有一个属性
的类。我也有一个该属性的 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/