在类定义期间为属性分配函数时,此属性将保留具有原始签名的普通函数:
>>> def f(x):
return x**2
>>> class A:
ff = f
>>> A.ff
<function f at 0x037D6ED0>
实例化类时,此属性将成为绑定方法,其签名将更改:
>>> a = A()
>>> a.ff
<bound method A.f of <__main__.A object at 0x03A726B0>>
我需要定义一个类,以后我可以通过在实例化之前更改一些属性来自定义。其中一个属性是一个功能,我需要它来保持它的签名。
使用@staticmethod
显然不是一个选项,因为没有在类定义/自定义上定义函数,并且装饰不适用于属性。
有没有办法在实例化时将函数转换为绑定方法?
答案 0 :(得分:1)
使用@staticmethod显然不是一个选项,因为没有在类定义/自定义上定义函数,并且装饰不适用于属性。
不,staticmethod
是选项,只需直接调用它即可生成实例:
class A:
ff = staticmethod(f)
@decorator
语法只是在创建函数对象后生成完全相同的赋值的语法糖。
这很好用:
>>> def f(x):
... return x**2
...
>>> class A:
... f_unchanged = f
... f_static = staticmethod(f)
...
>>> A().f_unchanged
<bound method f of <__main__.A object at 0x10cf7b2e8>>
>>> A().f_static
<function f at 0x10cfb6510>
>>> A().f_static(4)
16
定义函数的位置并不重要,def
语句会生成函数对象,无论它在何处使用。 def name
是两件事:创建函数对象和该函数对象的赋值没有名称。无论是否在class
声明或其他地方发生实际上并不重要。
将函数转换为绑定方法的是在实例上访问它们,然后https://xxxxxxxxx.vssps.visualstudio.com启动。例如,访问A().ff
变为{{1}并且它是函数上的A.__dict__['ff'].__get__(A())
方法,它生成绑定方法。 bound方法只是实际函数的代理,在调用时将实例作为第一个参数传递。
__get__
定义了一个不同的staticmethod
,只返回原始函数,未绑定。您可以直接使用这些__get__
方法:
__get__