Methode aus Modul laden..Fehler

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
tspaddy
User
Beiträge: 7
Registriert: Mittwoch 30. August 2006, 21:36
Wohnort: Essen

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
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.
tspaddy
User
Beiträge: 7
Registriert: Mittwoch 30. August 2006, 21:36
Wohnort: Essen

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
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.
tspaddy
User
Beiträge: 7
Registriert: Mittwoch 30. August 2006, 21:36
Wohnort: Essen

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...)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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*
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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()
tspaddy
User
Beiträge: 7
Registriert: Mittwoch 30. August 2006, 21:36
Wohnort: Essen

Wenns n zweiter Name fürs gleiche Ding ist und keine Kopie, dann ist das eigentlich per Definition n Zeiger.
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.
tspaddy
User
Beiträge: 7
Registriert: Mittwoch 30. August 2006, 21:36
Wohnort: Essen

Thanx
Antworten