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
我有一个 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