Seite 1 von 1

Geister-Argument

Verfasst: Montag 26. Oktober 2009, 14:09
von mutanab
Hey,

irgendwie stehe ich gerade auf dem Schlauch, weil ich ein Argument zu viel hab. Ich mache folgendes:

modul __init__.py:

Code: Alles auswählen

import ConvertRadon as CR

...

radmat= CR.RadonData()   #erstelle Instanz der Klasse Radon Data in CR
radonmatrix=radmat.getRadonTransform(path,prepattern,postpattern,numDegree, start,stop) #rufe Methode der Klasse mit 6 Parametern

...
modul ConvertRadon sieht kurz gesagt so aus:

Code: Alles auswählen


#imports

class RadonData():
...
...  #verschiedene Hilfsfunktionen
...
def getRadonTransform(path,prepat,backpat,numDegree,start,step):
 ...
 ...  #code
 ...

Der Fehler den ich bekomme, wenn ich für jedes der 6 Argumente einen Wert übergebe lautet:
TypeError: getRadonTransform() takes exactly 6 arguments (7 given)

Versuchweise habe ich die Funktion der Klasse einmal leer aufgerufen und entsprechend folgendes erhalten:

Aufruf:
radmat=CR.RadonData()
radonmatrix=radmat.getRadonTransform()

Fehler:
TypeError: getRadonTransform() takes exactly 6 arguments (1 given)

Frage: Wo kommt das eine, unsichtbare Argument her und wie kann ich es entfernen?

Gruß
mutanab

Re: Geister-Argument

Verfasst: Montag 26. Oktober 2009, 14:14
von Hyperion
mutanab hat geschrieben: Frage: Wo kommt das eine, unsichtbare Argument her und wie kann ich es entfernen?
Du kannst es nicht entfernen! Als erstes Argument einer Methode, wird immer das Klassenobjekt übergeben. Daher gibt es die Konvention, den ersten Parameter "self" zu nennen. Bei Dir heißt er "path", Python packt da aber eben nicht den von Dir angenommenen Path rein, sondern eben das Klassenobjekt. Füge also in der Klasse ConvertRadon ein "self" als ersten Parameter der Methode ein, und schon wird es klappen.

Du solltest Dir mal dringend den Abschnitt über Klassen im Tutorial durchlesen!

Edit: Mal ein Beispiel:

Code: Alles auswählen

In [16]: class Foo(object):
   ....:
   ....:     def test(self):
   ....:         print self
   ....:
   ....:

In [17]: f = Foo()

In [18]: f.test()
<__main__.Foo object at 0x1d7a410>

Verfasst: Montag 26. Oktober 2009, 14:19
von mutanab
:D *lach* das self ist mir nur weg gekommen

danke für das schnelle entfernen, des Brettes vorm Kopf (aber ich les auch noch mal das tutorial, kann ja nie schaden)

gruß
mutanab

Verfasst: Montag 26. Oktober 2009, 14:26
von CM
Hoi,

was sind denn RadonData? 2D (ggf. 3D)-Matrices? In dem Fall: numpy & scipy nehmen. Tipp:

Code: Alles auswählen

from scipy.misc import radon
Die Transformation an sich würde ich auch nicht als Klasse, sondern eben als Funktion auffassen.

Leider rel. schlecht dokumentiert in scipy, aber bei der Mailingliste gibt es sicher Hilfe. Im Zweifel würde ich meine, dass diese Tranformation performater ist als ein Eigenbau und auf Performance wird es wohl ankommen. (Machst Du Tomographie oder was in der Richtung? Ggf. habe ich eine Kontaktadresse für Dich von jemandem, der was Ähnliches mit Python macht.)

HTH
Christian

PS Und es ist wenig ratsam solche Klassen in __init__.py zu stecken.

Verfasst: Montag 26. Oktober 2009, 17:22
von b.esser-wisser
@Hyperion:
Das Wort "Klassenobjekt" für eine Instanz einer Klasse ist sehr unglücklich gewählt - es gibt in Python ja wirklich Klassenobjekte - Klassen eben

Code: Alles auswählen

>>> class Foo(object):
...   pass
...
>>> isinstance(Foo, object)
True
>>> foo = Foo()
>>> isinstance(foo, Foo)
True
scnr, Jörg
edit: phpbb ist Schuld, auch an den Typos

Verfasst: Montag 26. Oktober 2009, 17:39
von Hyperion
b.esser-wisser hat geschrieben:@Hyperion:
Das Wort "Klassenobjekt" für eine Instanz einer Klasse ist sehr unglücklich gewählt - es gibt in Python ja wirklich Klassenobjekte - Klassen eben
Du hast Recht! Wobei das Wort "Instanz" auch umstritten ist. Einigen wir uns auf "Objekt einer Klasse"?

Verfasst: Montag 26. Oktober 2009, 17:44
von numerix
Hyperion hat geschrieben:
b.esser-wisser hat geschrieben:@Hyperion:
Das Wort "Klassenobjekt" für eine Instanz einer Klasse ist sehr unglücklich gewählt - es gibt in Python ja wirklich Klassenobjekte - Klassen eben
Du hast Recht! Wobei das Wort "Instanz" auch umstritten ist. Einigen wir uns auf "Objekt einer Klasse"?
Die Bezeichnung "Exemplar" (einer Klasse) finde ich auch nicht schlecht.
Es gibt zu dieser Thematik mindestens einen längeren Thread im Forum.