习惯了函数式,动不动传一个函数。但是直接把函数作为类方法保存,再调用时会报错。
举一个unittest时的例子
class MyTestCase(unittest.TestCase): @classmethod def setUpClass(cls): print('测试 ') .... factory = make_factory(XXX) #非绑定函数必须这样用staticmethod()包装 #cls.factory = staticmethod(factory) cls.factory = factory def test_factory(self): scenario1 = self.factory("YYY")
在setUpClass()里,按函数式方方式,用make_factory构造一个factory,是1个接受1个参数函数。希望在后面的测试用例里用这个去构造对象,如果直接
cls.factory = factory
在测试用例里,传入1个参数,会报错:
TypeError: factory() takes 1 positional argument but 2 were given
为什么多传了1个参数? 因为用
cls.XXX=XXX或 self.XXX=XXX保存的方法,
默认是作为绑定方法。这里是classmethod,所以绑定的第一个变量是cls,也就是这里的MyTestCase
想在类方法里得到一般函数那样的行为,一般是用@staticmethod装饰器,但是这种直接保存1个函数的,可以直接
cls.factory = staticmethod(factory)
因为装饰器,也是一个函数。所以可以这样直接用,不需要import任何模块。
如果是想写在__init__(self)里,而不是classmethod里
要这样
class A(): def __init__(self, fn): A.fn = staticmethod(fn)
因为staticmethod的主语,只能是类名。A.fn不能写成self.fn,否则会
TypeError: 'staticmethod' object is not callable