python類中儲存非繫結方法作為成員函式
阿新 • • 發佈:2018-12-13
習慣了函式式,動不動傳一個函式。但是直接把函式作為類方法儲存,再呼叫時會報錯。
舉一個unittest時的例子
class MyTestCase(unittest.TestCase): @classmethod def setUpClass(cls): print('測試\n') .... 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任何模組。