2016-07-25 14 views
0

Betrachten Sie den folgenden Code ein:ungebundene Methode mit "Enum-like" Klasse

ff = lambda x : x 
gg = lambda x : x*2 
class FunctionCollection(object): 
    f = ff 
    g = gg 

def FunctionCaller(x, Type = FunctionCollection.f): 
    return Type(x) 

y = FunctionCaller(x) 

Es gibt eine

ungebundene Methode() muss mit FunctionCollection Instanz als erstes Argument (got ndarray Instanz aufgerufen werden stattdessen)

Nachricht, die ich nicht verstehe. Eine naheliegende Lösung wäre, ff und gg INSIDE FunctionCollection zu definieren, aber ich würde gerne wissen, ob es nicht möglich ist, ff und gg in einem Modul zu definieren, dann eine Enum mit den "Zeigern" zu diesen Funktionen zu erstellen und diese dann zu übergeben "Zeiger" als Argumente. Entschuldigung für die Namensgebung im C-Stil.

Was ist daran falsch?

Danke,

Mike

+0

„Eine offensichtliche Lösung ff definieren würde und gg INSIDE FunctionCollection "- nein, würde nicht helfen. – user2357112

+0

in 'y = FunctionCaller (x)', wo ist 'x' definiert? –

Antwort

1

Ihr Code tatsächlich tut Arbeit auf python3.x. Wenn Sie Python2.x unterstützen müssen, können Sie eine static verwenden:

ff = lambda x : x 
gg = lambda x : x*2 
class FunctionCollection(object): 
    f = staticmethod(ff) 
    g = staticmethod(gg) 

def FunctionCaller(x, Type = FunctionCollection.f): 
    return Type(x) 

y = FunctionCaller(1.0) 
print(y) 

Eine andere Möglichkeit wäre FunctionCollection als „Singleton“ zu verwenden und die Funktionen der einzelnen Instanz binden ...

ff = lambda x : x 
gg = lambda x : x*2 
class FunctionCollection(object): 
    pass 

FUNC_COLLECTION = FunctionCollection() 
FUNC_COLLECTION.f = ff 
FUNC_COLLECTION.g = gg 


def FunctionCaller(x, Type = FUNC_COLLECTION.f): 
    return Type(x) 

y = FunctionCaller(1.0) 
print(y) 

Ich mag würde wissen, ob es nicht möglich ist, ff und gg in einem Modul zu definieren, dann eine eNUM erstellen, um die „Zeiger“ auf jene Funktion enthält, und schließlich diese "Zeiger" als Argumente übergeben.

Ich denke, dass dies eine offensichtliche Frage aufwirft ... Warum brauchen Sie diese zusätzliche Ebene der Indirektion? Es scheint mir unnötig .

die sicherlich nicht zu sagen, dass ist es nicht erforderlich ist - nur, dass ich als die noch den Zweck nicht verstehen ...

+0

Danke für beide Antworten! Eigentlich hast du recht, es gibt KEINEN echten Grund für eine zusätzliche Indirektion. Ich schrieb einfach alle Funktionen im Hauptmodul und dachte schließlich, es könnte nützlich sein, sie alle als statische Methode einer Klasse zu haben. Bevor ich den Code migrierte, versuchte ich den "schnellen Weg" und ich blieb stecken, daher meine Frage ... :-) – Mike

Verwandte Themen