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

Python如何获取某些property.setter的绑定方法,python,properties,attributes,python-descriptors,Python,Properties,Attributes,Python Descriptors,我有一个带有一个属性的类。我还有一个用于该属性的setter。如何获取属性.setter的绑定方法 我为什么这么问 使用常规方法,这很容易。只需使用类\实例.方法\名称 然而,对于属性,我很难弄清楚这一点,因为它返回一个描述符对象 示例代码 这是用Python 3.6编写的: class-SomeClass: 定义初始化(自): self.\u some\u attr=0 @财产 定义一些属性(自)->int: 返回自我。\u一些\u属性 #我怎样才能得到这个绑定方法? @某个属性设置器 定

我有一个带有一个
属性的类。我还有一个用于该属性的setter。如何获取
属性.setter的绑定方法


我为什么这么问

使用常规方法,这很容易。只需使用
类\实例.方法\名称

然而,对于
属性
,我很难弄清楚这一点,因为它返回一个描述符对象


示例代码

这是用Python 3.6编写的:

class-SomeClass:
定义初始化(自):
self.\u some\u attr=0
@财产
定义一些属性(自)->int:
返回自我。\u一些\u属性
#我怎样才能得到这个绑定方法?
@某个属性设置器
定义一些属性(self,val:int)->无:
self.\u some\u attr=val
def normal_方法(self,val:int)->无:
self.some_attr=val
如果名称=“\uuuuu main\uuuuuuuu”:
some_class=SomeClass()
打印(一些类。一些属性)#打印:0
打印(some_class.normal_方法)#打印:绑定方法SomeClass.normal_方法

在Python文档中,您可以在纯Python中找到
属性
描述符的等效实现,其中setter方法仅使用给定的对象和目标值调用unbound方法:

def __set__(self, obj, value):
    if self.fset is None:
        raise AttributeError("can't set attribute")
    self.fset(obj, value) # unbound method called
换句话说,当您使用属性setter时,实际上没有创建绑定方法,因此当绑定方法实际上不存在时,无法“获取”该方法

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

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

2.

没有很好的方法可以做到这一点,因为没有创建实际的绑定方法。实际上,您必须将从类中检索到的setter部分应用于实例本身。所以
lambda v:SomeClass.someu attr.\uuu set\uuuu(someu class,v)
例如…好的,这很有意义,谢谢@juanpa.arrivillaga!我要开一个赏金,看看有没有别的办法。请随便回答!鉴于juanpa.arrivillaga的评论,你到底想要什么?分配给
f
的东西,以便
f(v)
执行分配
some_class.some_attr=v
?是@chepner,很抱歉说得含糊不清。是否有办法使用
inspect.signature
获取
某些属性设置器的签名?运行
inspect.signature(SomeClass.someAttr.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu)
会产生
,这是泛型
\uuuuuuuuuuuuuuuuuuuuuuuuuu。我怎样才能让它在某种程度上匹配一个非属性,
inspect.signature(some_class.normal_method)
?我意识到我们现在已经偏离了这个问题的主题,我将把这个问题重命名为match,如果这有什么意义的话。谢谢@blhsing的解释,这对我的理解有很大帮助。不客气。在
类型
模块的文档中确实没有
类型.方法类型
的使用信息;但是,当它详细说明如何使用等效Python代码将绑定方法创建为描述符getter时,它的用法实际上在描述符的文档中得到了演示: