2013-03-28 28 views
1

我正在製作一組調用在不同模塊中定義的函數的類。要知道他們必須調用哪個函數,該函數將被存儲爲該類的一個變量(或者至少這是我所嘗試的)。但是,當我嘗試調用它時,它會自動假定該函數是一個類方法,並將「self」作爲參數傳遞,這在邏輯上會導致錯誤,因爲該函數接收的參數過多。你知道我怎樣才能避免這個函數成爲一個類的方法。Python中,如何將非類方法保留爲非類方法?

的代碼將是這樣的:

# Module A 
def func1(a): 
    print a 
def func2(a): 
    print a,a 

# Module B 
from A import * 
class Parent: 
    def func(): 
     self.sonFunc("Hiya!") 
class Son1: 
    sonFunc = func1 
class Son2: 
    sonFunc = func2 

so = Son1() 
s.func() 
# Should print "Hiya!" 
s = Son2() 
s.func() 
# Should print "Hiya! Hiya!" 

感謝

回答

5

你在做什麼是有些非標準/奇怪的事情,但是這應該工作:

class Son_1(object): 

    son_func = staticmethod(func_1) 

class Son_2(object): 

    son_func = staticmethod(func_2) 

通常情況下,staticmethod被用作裝飾器,但由於裝飾器只是語法糖,因此您也可以使用它們。

一個可以說是清潔的,而且更先進的方法是用metaclass

class HasSonMeta(type): 

    def __new__(cls, name, bases, attrs): 

     attrs['son_func'] = staticmethod(attrs.pop('__son_func__')) 
     return type.__new__(cls, name, bases, attrs) 


class Son1(object): 

    __metaclass__ = HasSonMeta 
    __son_func__ = func_1 

class Son2(object): 

    __metaclass__ = HasSonMeta 
    __son_func__ = func_2 

使用這種形式,你也可以直接在類中定義的功能(雖然然後它會變得更加混亂給任何人閱讀此代碼):

class Son3(object): 

    __metaclass__ = HasSonMeta 

    def __son_func__(): 

     pass 

雖然有可能是一個非常窄/晦澀的場景,這將是一個最優的實現,你可能會得到更好的通過將在基類的函數,然後參照送達(或以上消除)他們在孩子們的需要。

+0

+1爲非標準/奇數。 –

+0

哇,謝謝。 'staticmethod'完美地解決了它。儘管目前這是過分的,但我喜歡閱讀元類。 – Blackzafiro