保持函数成为实例化的方法

时间:2016-12-17 10:28:40

标签: python class methods

在类定义期间为属性分配函数时,此属性将保留具有原始签名的普通函数:

>>> 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显然不是一个选项,因为没有在类定义/自定义上定义函数,并且装饰不适用于属性。

有没有办法在实例化时将函数转换为绑定方法?

1 个答案:

答案 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__