Seite 1 von 1
object has no attribute
Verfasst: Freitag 3. November 2017, 18:08
von Lou Cyphr3
Hallo,
mal ganz allgemein: Was bedeutet es, wenn ein Object kein attribute hat?
Ich verstehe es so, dass Object x nichts hat worauf es sich beziehen kann, sehe ich das richtig?
Seit ein paar Tagen treibt mich diese Meldung zum Wahnsinn.Und das gefällt mir im allgemeinen nicht.
Lou.
Re: object has no attribute
Verfasst: Freitag 3. November 2017, 18:22
von sls
Ganz allgemein würde ich sagen, dass es schlicht bedeutet, dass das Attribut welches du über das Objekt ansprechen möchtest, nicht gefunden bzw. vorhanden ist.
Code: Alles auswählen
class Example:
attribute_example = "Beispiel"
new_object = Example()
print(new_object.attribute_example)
print(new_object.another_attribute)
Beim letzten Aufruf von "another_attribute" wird der Fehler auftauchen, da in der Klasse Example schlicht kein Attribut mit diesem Namen vorhanden ist.
Re: object has no attribute
Verfasst: Freitag 3. November 2017, 20:59
von Lou Cyphr3
Soweit hab ich keine Probleme mitzukommen.
Nun konkreter
Code: Alles auswählen
class Game:
def __init__(self):
pg.init()
self.screen = pg.display.set_mode((WIDTH, HEIGHT))
pg.display.set_caption(TITLE)
self.clock = pg.time.Clock()
self.load_data()
def load_data(self):
game_folder = path.dirname(__file__)
img_folder = path.join(game_folder, 'img')
map_folder = path.join(game_folder, 'maps')
player = self.player
self.map = TiledMap(path.join(map_folder, 'mappp.tmx'))
self.map_img = self.map.make_map()
self.map_rect = self.map_img.get_rect()
self.player()
self.rect()
self.player_img = pg.image.load(path.join(img_folder, PLAYER_IMG)).convert_alpha()
Ich habe hier mit der logik des beispiels doch ein 'player' attribut in meinen object 'game' oder nicht?
(Zeile 13 hab ich postum als versuch ergänzt)
Re: object has no attribute
Verfasst: Freitag 3. November 2017, 21:38
von sls
Ist das dein vollständiger Code? Python wird in Zeile 13 spätestens Probleme machen, da nicht bekannt ist woher self.player kommen soll. Das Attribut ist weder in der Klasse Game deklariert worden, noch wird es von einer anderen Klasse (mutmaßlich aus einem deiner Importe respektive Pygame) geerbt.
Ein Objekt "game" sehe ich hier auch nicht. Meinst du die Klasse Game? Oder hast du irgendwo noch eine Instanz "game" (Objekt) der Klasse Game() erstellt?
Re: object has no attribute
Verfasst: Freitag 3. November 2017, 21:45
von noisefloor
Hallo,
nein, hast du nicht. `self.player` gibt es ja nicht -> darum die Fehlermeldung.
Du hast du Attribute `screen` und `clock`, da war's.
Der ganze Code ist auch ziemlich konfus bis falsch. `load_data` macht auch scheinbar mehr als nur Daten zu laden.
Grundsätzlich sollte man alle Attribute, die eine Klasse haben soll, in der `init()` Methode anlegen. Wenn zu diesem Zeitpunkt noch kein Wert vorhanden ist, dann eben mit `self.some_attribute = None`.
Gruß, noisefloor
Re: object has no attribute
Verfasst: Freitag 3. November 2017, 21:47
von Sophus
@Lou Cyphr3: sls hat dir einige Probleme aufgezeigt. Zu deiner Annahme: Nein, in Zeile 13 handelt es sich nicht um ein Attribut, sondern um eine lokale Variable, die nur innerhalb der load_data()-Methode "bekannt" ist. Angenommen in der lokalen player -Variable ist ein Wert gespeichert, sagen wir player ="nothing"', dann kennt nur die load_data()-Methode den Wert. Die Game()-Klasse hat überhaupt keine Peilung darüber. Wie noisefloor schon sagte, muss player in der init()-Methode hinterlegt werden.
Re: object has no attribute
Verfasst: Freitag 3. November 2017, 22:14
von kbr
Lou Cyphr3 hat geschrieben:(Zeile 13 hab ich postum als versuch ergänzt)
Von wo postest Du?
Re: object has no attribute
Verfasst: Samstag 4. November 2017, 15:04
von Lou Cyphr3
@sls nein das ist nicht mein vollständiger code.
@noisefloor ich habe angenommen, dass meine init sehr wohl weiß was in load.data los ist, da diese ja bereits in der init abgefragt wird. und was macht load,data denn noch außer daten laden?
@kbr wie meinst du das? natürlich aus der unterwelt!
Die Frage ist auch ein bisschen, wenn ich garkein object habe, wie kann dann ein attribut fehlen?
Re: object has no attribute
Verfasst: Samstag 4. November 2017, 15:35
von kbr
@Lou Cyphr3: Nun, wer hat schon die Möglichkeit posthum zu posten ... und dann auch noch einen lokalen Provider
Du hast im übrigen sehr wohl ein Objekt, nämlich 'self'. Aber ohne das gewünschte Attribut 'player'.
Re: object has no attribute
Verfasst: Samstag 4. November 2017, 15:39
von sls
Lou Cyphr3 hat geschrieben:
Die Frage ist auch ein bisschen, wenn ich garkein object habe, wie kann dann ein attribut fehlen?
In Python ist alles ein Objekt. Nochmal: du versuchst in Zeile 13 einer lokalen Variable "player" ein Attribut namens "self.player" zu zuweisen. Python versucht zur Laufzeit genau diese Anweisung auszuführen, weiß aber nicht wo es self.player hernehmen soll.
Re: object has no attribute
Verfasst: Samstag 4. November 2017, 19:07
von noisefloor
Hallo,
ich habe angenommen, dass meine init sehr wohl weiß was in load.data los ist
Ich glaube, du hast da mehrere Denk- / Verständnisfehler drin. `init()` wird 1x ausgeführt, wenn du eine Instanz der Klasse anlegst. `self.load_data()` ist einfach nur ein Funktionsaufruf ohne Rückgabewert - was in `load_data()` passiert, ist `init()` "egal". Andersrum könntest du aber aus `load_data()` auf Attribute, die bereits in `init()` definiert wurden, zugreifen.
Abgesehen davon, dass `self.player` halt nicht existiert, weil du es halt bis dato nicht angelegt hast.
Gruß, noisefloor