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.
object has no attribute
-
- User
- Beiträge: 59
- Registriert: Donnerstag 6. Juli 2017, 00:04
Cours, camarade, le vieux monde est derrière toi!
- 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.
Beim letzten Aufruf von "another_attribute" wird der Fehler auftauchen, da in der Klasse Example schlicht kein Attribut mit diesem Namen vorhanden ist.
Code: Alles auswählen
class Example:
attribute_example = "Beispiel"
new_object = Example()
print(new_object.attribute_example)
print(new_object.another_attribute)
When we say computer, we mean the electronic computer.
-
- User
- Beiträge: 59
- Registriert: Donnerstag 6. Juli 2017, 00:04
Soweit hab ich keine Probleme mitzukommen.
Nun konkreter
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)
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()
(Zeile 13 hab ich postum als versuch ergänzt)
Cours, camarade, le vieux monde est derrière toi!
- 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?
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.
- 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
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
@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.
-
- 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?
@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!
- sls
- User
- Beiträge: 480
- Registriert: Mittwoch 13. Mai 2015, 23:52
- Wohnort: Country country = new Zealand();
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.Lou Cyphr3 hat geschrieben: Die Frage ist auch ein bisschen, wenn ich garkein object habe, wie kann dann ein attribut fehlen?
When we say computer, we mean the electronic computer.
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Abgesehen davon, dass `self.player` halt nicht existiert, weil du es halt bis dato nicht angelegt hast.
Gruß, noisefloor
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.ich habe angenommen, dass meine init sehr wohl weiß was in load.data los ist
Abgesehen davon, dass `self.player` halt nicht existiert, weil du es halt bis dato nicht angelegt hast.
Gruß, noisefloor