我知道必须有办法做到这一点。但是我收到错误“TypeError:第一个参数必须是可调用的。”
我可以采取哪些不同的方式来完成这项工作?
class FaxMachine(object):
MODEL_NO = '100'
@staticmethod
def load_fax(fax, error=''):
# send fax here
fail_fax = functools.partial(load_fax, error='PC LOAD LETTER')
答案 0 :(得分:2)
staticmethod
个对象不可调用。它们是descriptors,用于在__func__
属性中保留对原始函数的引用。
以下是有效的:
# Note: apply staticmethod again
fail_fax = staticmethod(partial(load_fax.__func__, error='PC LOAD LETTER'))
您还可以在类命名空间中定义辅助函数,以避免不必要的属性查找:
def _load_fax(fax, error=''):
# ...
# _load_fax is an ordinary function
load_fax = staticmethod(_load_fax)
fail_fax = staticmethod(partial(_load_fax, error='PC LOAD LETTER'))
虽然正确的Python 3.4+解决方案是使用partialmethod
,它旨在使用描述符:
fail_fax = partialmethod(load_fax, error='PC LOAD LETTER')
答案 1 :(得分:2)
方法和函数在"调用":使用__call__
直接调用函数时表现不同,而方法(通常不是方法,我认为只有描述符)由__get__
调用。
因此,functools
- 模块包含另一个partial
方法:functools.partialmethod
:
functools.partialmethod(load_fax, error='PC LOAD LETTER')
官方文档包含一个非常好的解释,特别是关于staticmethod
。
答案 2 :(得分:2)
这可能是一种更聪明的方法,但这似乎工作正常。
import functools
class FaxMachine(object):
MODEL_NO = '100'
@staticmethod
def load_fax(fax, error=''):
print error or fax
FaxMachine.fail_fax = functools.partial(FaxMachine.load_fax, error='PC LOAD LETTER')
f = FaxMachine()
f.load_fax('hi')
f.fail_fax('hi')