Forums Neueste Beiträge
 

Funktion: "class" oder "def"?

06/08/2009 - 14:30 von Ole Streicher | Report spam
Hallo Gruppe,

ich möchte mir eine komplizierte Funktion bauen, die ich (per scipy)
fitten und das gefittete Ergebnis dann verwenden möchte. Die Funktion
hàngt dabei von einer Reihe von Parametern ab -- also eine Funktion (in
LaTeX-Schreibweise)

f_{p_1, p_2, ...} (x)

Ich möchte sie auch spàter als "func(x)" verwenden können, aber auch an
die Parameter kommen.

Dafür sehe ich jetzt erstmal zwei prinzipielle Möglichkeiten:

1. Definition der Funktion als Klasse:

class Func(object):
def __init__(self, p1, p2):
self.p1 = p1
self.p2 = p2

def value(self, x):
return mycomplicatedfunction(p1, p2, x)

Die Funktion bekomme ich mit

f = Func(p1, p2)
func = f.value

print func(x) # als Beispiel
print f.p1, f.p2

2. Definition der Funktion mittels geschachteltem "def":

def Func(p1, p2):
def f(x):
return mycomplicatedfunction(p1, p2, x)
f.p1 = p2
f.p2 = p2
return f

Die Funktion làsst sich jetzt eleganter erzeugen mit

func = Func(p1, p2)

print func(x) # als Beispiel
print func.p1, func.p2

allerdings sieht die Zuweisung "f.p1 = p1" etwas eigenartig aus. Ist das
wirklich der eleganteste Weg oder birgt er Fallen?

Und welches ist die beste Möglichkeit, das Problem zu lösen (... und
habe ich wieder mal nur einen Knoten im Hirn)?

Viele Grüße

Ole
 

Lesen sie die antworten

#1 Diez B. Roggisch
06/08/2009 - 14:38 | Warnen spam
Ole Streicher wrote:

Hallo Gruppe,

ich möchte mir eine komplizierte Funktion bauen, die ich (per scipy)
fitten und das gefittete Ergebnis dann verwenden möchte. Die Funktion
hàngt dabei von einer Reihe von Parametern ab -- also eine Funktion (in
LaTeX-Schreibweise)

f_{p_1, p_2, ...} (x)

Ich möchte sie auch spàter als "func(x)" verwenden können, aber auch an
die Parameter kommen.

Dafür sehe ich jetzt erstmal zwei prinzipielle Möglichkeiten:

1. Definition der Funktion als Klasse:

class Func(object):
def __init__(self, p1, p2):
self.p1 = p1
self.p2 = p2

def value(self, x):
return mycomplicatedfunction(p1, p2, x)

Die Funktion bekomme ich mit

f = Func(p1, p2)
func = f.value

print func(x) # als Beispiel
print f.p1, f.p2

2. Definition der Funktion mittels geschachteltem "def":

def Func(p1, p2):
def f(x):
return mycomplicatedfunction(p1, p2, x)
f.p1 = p2
f.p2 = p2
return f

Die Funktion làsst sich jetzt eleganter erzeugen mit

func = Func(p1, p2)

print func(x) # als Beispiel
print func.p1, func.p2

allerdings sieht die Zuweisung "f.p1 = p1" etwas eigenartig aus. Ist das
wirklich der eleganteste Weg oder birgt er Fallen?




Wieso sieht das eigentartiger aus als mit der Func-Klasse? Zuweisung ist
zuweisung.

Und welches ist die beste Möglichkeit, das Problem zu lösen (... und
habe ich wieder mal nur einen Knoten im Hirn)?



Die beste Moeglichkeit ist denke ich das hier:


class func(object):

def __init__(self, p1=default,...):
self.p1 = p1
...

def __call__(self, arg, ...):
return mycomplicatedfunction(arg, .., self.p1, ...)


Dann kannst du einfach mit

f = func()

f.p1 = wert

oder gar

f.eine_methode_die_was_einstellt()

Einstellungen vornehmen, und mit

f(argument)

einfach aufrufen.

Ähnliche fragen