Klassenattributte umbn(__init__ aufruf...was ruft er da auf)

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.
grandma
User
Beiträge: 26
Registriert: Mittwoch 30. Mai 2007, 15:04

Klassenattributte umbn(__init__ aufruf...was ruft er da auf)

Beitragvon grandma » Montag 18. Juni 2007, 12:26

Ich will ein Objekt erzeugen mit

chart = MyChart()

die Init von MyChart enthält nur self als Argument.

In der Init selber werden keine weiteren Objekte (ausser arrays) erzeugt.

Trotzdem kriege ich folgende Fehlermeldung:

"__init__ takes exactly 2 arguments 1 given"



Wenn ich in die init 2 dummy argumente reinmache, so kommt immer noch die selbe Meldung.
=> es ist nicht diese init die einen Fehler wirft...welche dann??

Irgendwelche Ideen?
Zuletzt geändert von grandma am Dienstag 19. Juni 2007, 11:23, insgesamt 1-mal geändert.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Montag 18. Juni 2007, 12:29

Ohne Code wohl kaum...
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
grandma
User
Beiträge: 26
Registriert: Mittwoch 30. Mai 2007, 15:04

Beitragvon grandma » Montag 18. Juni 2007, 12:38

[code=]
class MyChart(object):

def __init__(self):
self.rawData = []
self.calculatedData = []
self.lowerLimit = []
self.upperLimit = []
self.target = []
self.upperSpec = None
self.lowerSpec = None
self.specTarget = None
self.ooc = []
#self.db = queue.db
#self.calcData()
self.failures = [][/code]

aufruf wie gesagt mit chart = MyChart()
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Montag 18. Juni 2007, 13:18

Also bei mir kommt da keine Fehlermeldung. Ich wüsste auch nicht warum.
grandma
User
Beiträge: 26
Registriert: Mittwoch 30. Mai 2007, 15:04

Beitragvon grandma » Montag 18. Juni 2007, 13:26

[code=]try:
chart = MyChart()
except Exception, e:
f = open("except.txt", "wr")
f.write(str(e))
f.close()[/code]


Also das ist der genaue Aufruf

Der Aufruf erfolgt auch aus einem externe Methodenobjekt in Zope wenn das eine Rolle spielt. (der Zugriff auf andere Klassen mit daraus funktioniert)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Re: __init__ aufruf...was ruft er da auf?

Beitragvon Y0Gi » Montag 18. Juni 2007, 13:31

grandma hat geschrieben:Wenn ich in die init 2 dummy argumente reinmache, so kommt immer noch die selbe Meldung.
=> es ist nicht diese init die einen Fehler wirft...welche dann??

Das verrät der komplette Traceback.

Möglicherweise ist da eine veraltete Version im Spiel.
grandma
User
Beiträge: 26
Registriert: Mittwoch 30. Mai 2007, 15:04

Beitragvon grandma » Montag 18. Juni 2007, 13:37

Ich habe eigentlich gar keinen Traceback, das mit der Exception in ein File schreiben ist auch nur einen Notlösung um überhaupt eine Fehlermeldung zu kriegen.
grandma
User
Beiträge: 26
Registriert: Mittwoch 30. Mai 2007, 15:04

Beitragvon grandma » Montag 18. Juni 2007, 14:26

[code=]Traceback (most recent call last):
File "/usr/local/Zope-2.9.3/Extensions/web.py", line 81, in go
chart = MyChart()
TypeError: __init__() takes exactly 2 arguments (1 given)
[/code]
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Beitragvon Sr4l » Montag 18. Juni 2007, 14:28

Code: Alles auswählen

import sys
import traceback
"".join(
    traceback.format_exception(
        sys.exc_type,sys.exc_value,sys.exc_traceback))


Wenn du den Inhalt dieses Code Mixes in die Datei schreibst bekommst du ein Traceback.
Eine absolute Geek Methode wäre es __init__ so zu verändern das es 2 Variablen entgegennimmt und man lässt sich die zweite einmal ausgeben :-)

*edit*

wie ich sehe hast du gerade die Traceback hin bekommen und wie ich sehe setzt du Zope ein. Kenne ich so nicht, aber bei ModPython ist es so, das man immer in einer Funktion als erstes die Variable `req` entgegen nimmt, so etwas wird es dann bei Zope auch sein.
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Beitragvon rolgal_reloaded » Montag 18. Juni 2007, 20:57

grandma hat geschrieben:[code=]
class MyChart(object):

def __init__(self):
self.rawData = []
self.calculatedData = []
self.lowerLimit = []
self.upperLimit = []
self.target = []
self.upperSpec = None
self.lowerSpec = None
self.specTarget = None
self.ooc = []
#self.db = queue.db
#self.calcData()
self.failures = [][/code]

Bei der Instanzierung werden für jede Instanz alle diese Attribute mit dem Boolwert False gesetzt. Wenn das so bleiben soll, würde ich sie als Klassenattribute setzen.

LG

rolgal_reloaded
BlackJack

Beitragvon BlackJack » Montag 18. Juni 2007, 23:30

Dann teilen sich alle Objekte dieses Typs die Attribute. Das ist *sehr* wahrscheinlich nicht das gewünschte Verhalten.
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Beitragvon rolgal_reloaded » Dienstag 19. Juni 2007, 06:28

BlackJack hat geschrieben:Dann teilen sich alle Objekte dieses Typs die Attribute. Das ist *sehr* wahrscheinlich nicht das gewünschte Verhalten.


Keine Ahnung was gewünscht ist, aber wenn alle Objekte die gleichen Werte bekommen, ohne dass sie beim Aufruf anders gesetzt werden können, macht das doch wenig Sinn sie als Instanzvariablen zu definieren, oder?
grandma
User
Beiträge: 26
Registriert: Mittwoch 30. Mai 2007, 15:04

Beitragvon grandma » Dienstag 19. Juni 2007, 06:44

Naja doch macht schon Sinn, das Objekt wird einer anderen Methode übergeben und da werden dann die Werte verändert.

Hier sollen dann die Werte natürlcih nicht für alle Instanzen verändert werden sondern nur für eine.
(und so 100prozentig fertig ist das ganze noch nicht)

Aber zurück zum Thema...

Das mit den mehreren Variablen übergeben hab ich schon ausprobiert (2 dummy argumente)

Die Fehlermeldung bleibt bei "2 Arguments expected"
Also ist es nicht die eigentlich Init die aufgerufen wird.

Ahja, das Requestobjekt wird zumindestens an die externe Methode über self übergeben, ist also kein extra Argument.


Edit: Wenn ich mir es so recht überlege, da es keinerlei andere Fehlermeldung gab als ich die Argumente geändert habe, glaube ich das es irgendeine alte version ist die er da her nimmt... weiss nur nicht woher gerade.
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Beitragvon rolgal_reloaded » Dienstag 19. Juni 2007, 07:04

Die Werte können auch nur für eine Instanz geändert werden, wenn es Klassenattribute sind.

Oder überseh ich einen wesentlichen Unterschied:

Code: Alles auswählen

>>> class A:
       var1 = 5
       var2 = 10

   
>>> class B:
       def __init__(self):
                self.var1 = 5
                self.var2 = 10

      
>>> a1 = A()
>>> a2 = A()
>>> b1 = B()
>>> b2 = B()
>>> a1.var1
5
>>> a2.var1
5
>>> a1.var1 = 7
>>> a1.var1
7
>>> a2.var1
5
>>> b1.var1
5
>>> b2.var1
5
>>> b1.var1 = 7
>>> b1.var1
7
>>> b2.var1
5
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Dienstag 19. Juni 2007, 07:05

rolgal_reloaded hat geschrieben:
BlackJack hat geschrieben:Dann teilen sich alle Objekte dieses Typs die Attribute. Das ist *sehr* wahrscheinlich nicht das gewünschte Verhalten.


Keine Ahnung was gewünscht ist, aber wenn alle Objekte die gleichen Werte bekommen, ohne dass sie beim Aufruf anders gesetzt werden können, macht das doch wenig Sinn sie als Instanzvariablen zu definieren, oder?


Hi,

nur weil es Initialisierungswerte sind, heißt das nicht, dass sie im Namensraum der Klasse besser aufgehoben sind. Die Frage ist, ob Änderungen in einer Instanz einen Einfluss auf die anderen Instanzen haben soll.

Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder