zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【计算几何】多边形交集
    【计算几何】点在多边形内部
    【计算几何】线段相交
    【计算几何】多边形点集排序
    【JavaScript学习】JavaScript对象创建
    【CUDA学习】内核程序调试
    【CUDA学习】共享存储器
    【CUDA学习】全局存储器
    Charles是Mac的Fiddler抓包工具
    Charles是mac的iddler抓包工具
  • 原文地址:https://www.cnblogs.com/xuanmanstein/p/10113383.html
Copyright © 2011-2022 走看看