2016-04-28 19 views

Antwort

2

staticmethod Objekte sind nicht aufrufbar. Sie sind descriptors, die Verweise auf ursprüngliche Funktionen in ihren __func__ Attributen beibehalten.

So sind die folgenden Werke:

# Note: apply staticmethod again 
fail_fax = staticmethod(partial(load_fax.__func__, error='PC LOAD LETTER')) 

Sie auch eine Hilfsfunktion in der Klasse Namespace definieren können, um unnötige Attribut Lookups zu vermeiden:

def _load_fax(fax, error=''): 
    # ... 

# _load_fax is an ordinary function 
load_fax = staticmethod(_load_fax) 
fail_fax = staticmethod(partial(_load_fax, error='PC LOAD LETTER')) 

Obwohl die richtige Python 3.4+ Lösung ist Verwenden Sie die partialmethod, die entworfen wurde, um mit Deskriptoren zu arbeiten:

2

Methoden und Funktionen verhalten sich unterschiedlich, wenn "aufgerufen": Funktionen direkt aufgerufen werden, indem __call__ verwendet, während Methoden (nicht generell Methoden, ich denke nur Deskriptoren) von aufgerufen werden.

Deshalb ist die functools -Modul enthält eine weitere partial für Methoden: functools.partialmethod:

functools.partialmethod(load_fax, error='PC LOAD LETTER') 

Die offizielle Dokumentation enthält eine sehr gute Erklärung vor allem in Bezug auf staticmethod.

+0

Ist das nur in Python 3? – Greg

+0

Es scheint, dass ['' functools.partialmethod''] (https://docs.python.org/3.5/library/functools.html#functools.partialmethod) in Python 3.4 eingeführt wurde. – MSeifert

2

Es ist wahrscheinlich ein klügerer Weg, es zu tun, aber das scheint gut zu funktionieren.

import functools 

class FaxMachine(object): 
    MODEL_NO = '100' 

    @staticmethod 
    def load_fax(fax, error=''): 
     print error or fax 

FaxMachine.fail_fax = functools.partial(FaxMachine.load_fax, error='PC LOAD LETTER') 

f = FaxMachine() 
f.load_fax('hi') 
f.fail_fax('hi')