Geister-Argument

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
mutanab
User
Beiträge: 21
Registriert: Dienstag 25. März 2008, 15:04

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
"He, ich bin ein Mensch, aber ich bin fast zwanzigtausend Lichtjahre von zu Hause weg, und wir leben unter stockverrückten Aliens, umgeben von Superwaffen, mittendrin in dem verdammten, wahnwitzigen Trubel galaktischer Geschichte und Politik!"(Algebraist)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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>
Benutzeravatar
mutanab
User
Beiträge: 21
Registriert: Dienstag 25. März 2008, 15:04

: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
"He, ich bin ein Mensch, aber ich bin fast zwanzigtausend Lichtjahre von zu Hause weg, und wir leben unter stockverrückten Aliens, umgeben von Superwaffen, mittendrin in dem verdammten, wahnwitzigen Trubel galaktischer Geschichte und Politik!"(Algebraist)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

@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
Zuletzt geändert von b.esser-wisser am Montag 26. Oktober 2009, 17:44, insgesamt 1-mal geändert.
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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"?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Antworten