1. 程式人生 > >python類中儲存非繫結方法作為成員函式

python類中儲存非繫結方法作為成員函式

習慣了函式式,動不動傳一個函式。但是直接把函式作為類方法儲存,再呼叫時會報錯。

舉一個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任何模組。