2016-07-24 53 views
0

說我有一些很長的功能module.my_function這件事情是這樣的:Python的 - 使用外部功能類的方法

擁有大批指定參數和關鍵字參數的個數。我希望此功能既可作爲模塊module的一部分使用,也可作爲myClass的類方法使用。該函數的代碼將保持完全相同,但在myClass中,一些關鍵字參數可能採用不同的默認值。

這樣做的最好方法是什麼?以前我是做這樣的事情:

class myCLass(object): 
    def __init__(self,... 
    def my_function(self, param1,param2,param3='hello',param4='qaz',param5=['baz'],...): 
     module.my_function(param1,param2,param3=param3,param4=param4,param5=param5,...) 

這似乎有點傻寫所有這些論點,很多時候,尤其是在一個非常大的數量的參數。我也考慮過在類方法中使用類似module.my_function(**locals())的東西,但是我不知道如何處理self參數,我不知道這是否會導致其他問題。

我可能只是複製粘貼功能的完整代碼,但這並不似乎真的非常有效,當一切正在改變是幾個默認值,併爲my_function代碼非常長。有任何想法嗎?

+0

是否有一個原因,所有的關鍵字參數的個數必須是明確的,你不能只用kwargs? – James

+0

原因可能是我沒有經歷過編碼器......我如何在這種情況下使用kwargs並將一些默認值設置爲不同的東西?在上面的例子中說3-5是我正在改變的...我會只指定參數1-5,其餘的使用kwargs? – dieggsy

回答

1

你可以通過調用其__get__方法轉換功能綁定的方法(因爲所有功能descriptors爲好,因而有此方法)

def t(*args, **kwargs): 
    print(args) 
    print(kwargs) 

class Test(): 
    pass 
Test.t = t.__get__(Test(), Test) # binding to the instance of Test 

例如

Test().t(1,2, x=1, y=2) 
(<__main__.Test object at 0x7fd7f6d845f8>, 1, 2) 
{'y': 2, 'x': 1} 

注意,實例也作爲位置參數傳遞。這就是說,如果你希望你的函數是實例方法,函數應該是這樣寫的,即第一個參數作爲類的實例。否則,您可以將該函數綁定到None實例和該類,如staticmethod

Test.tt = t.__get__(None, Test) 
Test.tt(1,2,x=1, y=2) 
(1, 2) 
{'y': 2, 'x': 1} 

此外,使其成爲classmethod(第一個參數是類):

Test.ttt = t.__get__(Test, None) # bind to class 
Test.ttt(1,2, x=1, y=2) 
(<class '__main__.Test'>, 1, 2) 
{'y': 2, 'x': 1}