python类中保存非绑定方法作为成员函数

习惯了函数式,动不动传一个函数。但是直接把函数作为类方法保存,再调用时会报错。

举一个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

原文地址:https://www.cnblogs.com/xuanmanstein/p/10113383.html