object has no attribute

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
Lou Cyphr3
User
Beiträge: 59
Registriert: Donnerstag 6. Juli 2017, 00:04

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.
Cours, camarade, le vieux monde est derrière toi!
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

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.
When we say computer, we mean the electronic computer.
Lou Cyphr3
User
Beiträge: 59
Registriert: Donnerstag 6. Juli 2017, 00:04

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)
Cours, camarade, le vieux monde est derrière toi!
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

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?
When we say computer, we mean the electronic computer.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@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.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Lou Cyphr3 hat geschrieben:(Zeile 13 hab ich postum als versuch ergänzt)
Von wo postest Du?
Lou Cyphr3
User
Beiträge: 59
Registriert: Donnerstag 6. Juli 2017, 00:04

@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?
Cours, camarade, le vieux monde est derrière toi!
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Lou Cyphr3: Nun, wer hat schon die Möglichkeit posthum zu posten ... und dann auch noch einen lokalen Provider 8)

Du hast im übrigen sehr wohl ein Objekt, nämlich 'self'. Aber ohne das gewünschte Attribut 'player'.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

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.
When we say computer, we mean the electronic computer.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Antworten