Seite 1 von 1

Methode aus Modul laden..Fehler

Verfasst: Donnerstag 31. August 2006, 13:57
von tspaddy
Ich will aus der Datei "agents.py" die Methode "FileRead" der Klasse "CAGENTFILE" laden.

Aufbau "agents.py":

Code: Alles auswählen

class CAGENTFILE:
    path = ""
    
    def FileRead(self):
        datei = open( self.path,'r')
        ##....gekürzt, da Auszug
Ich binde das wie folgt ein:

Code: Alles auswählen

import agents
cAgentFile = agents.CAGENTFILE
cAgentFile.path = "f:/crowdpython/agentlist.txt" ##Methode in Klasse folgt
cAgentFile.FileRead() ##hier liegt der Hase im Pfeffer
Fehlermeldung:
cAgentFile.FileRead()
TypeError: unbound method FileRead() must be called with CAGENTFILE instance as first argument (got nothing instead)

Was bedeuted denn Unbound in dem Zusammenhang? Ist FileRead keine Methode der Klasse (einrückung müßte doch stimmen, oder)???
Erstellt "cAgentFile = agents.CAGENTFILE" nicht eine Instanz/Objekt der Classe CAGENTFILE???

Bin etwas Ratlos...und dankbar für Hilfe

Cu Paddy

Verfasst: Donnerstag 31. August 2006, 14:07
von BlackJack
Der Fehler bedeutet, das die Methode die Du aufrufst nicht an ein Objekt gebunden ist, eben "unbound". Du versuchst die Methode auf der *Klasse* aufzurufen.

Code: Alles auswählen

cAgentFile = agents.CAGENTFILE
Hier bindest Du den Namen `cAgentFile` an das Klassen-Objekt `agents.CAGENTFILE`

Code: Alles auswählen

cAgentFile = agents.CAGENTFILE()
So sollte es wohl aussehen: Ein Objekt vom Typ `agents.CAGENTFILE` erstellen und an `cAgentFile` binden.

Deine Namensschreibweise ist übrigens sehr unpythonisch. Namen ausschliesslich in Grossbuchstaben werden für gewöhnlich nur für Konstanten verwendet. Für Klassennamen MixedCase und für alles andere worte_mit_unterschrichen_in_kleinschreibung.

Verfasst: Donnerstag 31. August 2006, 14:44
von tspaddy
Hi,

mit den Namen ist klar...ist eher C++

Mit Python fummele ich auch erst seit 2-3 Tagen rum.

Den Fehler mit dem () hatte ich grade auch gefunden :D

Bedeutet das also Quasi, dass ich ein Dublikat/Zeiger der Klasse angelegt hab, wenn ich Objekt = Klasse anstelle Objekt = Klasse() schreibe?

Wäre damit also quasi:
Objekt = Klasse
ObjektNeu = Objekt() möglich? (ob es Sinn macht steht auf einem andern Blatt...)

Danke für deine schnelle Antwort

Verfasst: Donnerstag 31. August 2006, 16:29
von BlackJack
Ja genau das ist möglich. In diesem kleinen Beispiel macht es nicht viel Sinn, aber das man Klassen wie jedes andere Objekt zum Beispiel auch als Argumente in Funktions- und Methodenaufrufen übergeben kann, ist manchmal ganz nützlich.

Verfasst: Donnerstag 31. August 2006, 18:38
von tspaddy
Erstelle ich damit eine Kopie der Klasse oder nur einen Zeiger auf die Ursprungsklasse?
(mir ergründet sich grade der Sinn und Zweck nicht ganz...)

Verfasst: Donnerstag 31. August 2006, 18:56
von Leonidas
tspaddy hat geschrieben:Erstelle ich damit eine Kopie der Klasse oder nur einen Zeiger auf die Ursprungsklasse?
(mir ergründet sich grade der Sinn und Zweck nicht ganz...)
Du erstellst für das Objekt der Klasse einen zweiten Namen, sozusagen eine zweite Referenz.

Siehe auch http://bj.spline.de/download/names'n'objects.pdf.

Was First-Class-Functions für einen Sinn haben? Zum Beispiel kannst du so was machen:

Code: Alles auswählen

class Snake:
    def sound(self):
        print 'Zsss'

class Dog:
    def sound(self):
        print 'Wau-Wau'

for Animal in [Snake, Dog]:
    Animal().sound()
Das heißt du kannst mit Klassen und Funktionen wie mit Variablen arbeiten. Du kannst auch Klassen Funktionen zur Laufzeit zuweisen:

Code: Alles auswählen

In [7]: dog = Dog()
In [8]: def eat():
   ...:     print "*Hapsch*"
   ...:
In [9]: dog.eat = eat
In [10]: dog.eat()
*Hapsch*

Verfasst: Donnerstag 31. August 2006, 19:29
von Joghurt
Leonidas hat geschrieben:

Code: Alles auswählen

In [7]: dog = Dog()
In [8]: def eat():
   ...:     print "*Hapsch*"
   ...:
In [9]: dog.eat = eat
In [10]: dog.eat()
*Hapsch*
Was wohl eher gemeint war:

Code: Alles auswählen

class Foo:
  def bar():
    print "bar"

a = Foo()
def blubb(self):
  print "blubb"
Foo.blubb = blubb
a.blubb()

Verfasst: Donnerstag 31. August 2006, 20:28
von tspaddy
Wenns n zweiter Name fürs gleiche Ding ist und keine Kopie, dann ist das eigentlich per Definition n Zeiger.

Verfasst: Donnerstag 31. August 2006, 21:34
von BlackJack
Du kannst Dir die Namen als Zeiger auf Objekte vorstellen, aber Du kannst nicht selbst entscheiden ob derefenziert wird oder nicht. Es gibt Zeiger nicht als Datentyp in Python, Du kommst an diesen Zeiger nie heran, immer nur an Objekte.

Verfasst: Donnerstag 31. August 2006, 23:15
von tspaddy
Thanx