Spielfeld Objektorientiert darstellen

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.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@__blackjack__:
Zu 2. Also der Dekorator `@attrs` liest die Klassenattribute ein und führt dann alle Methoden in der Klasse aus, damit die Klassenattribute auch Werte bekommen. Ist das so einigermaßen richtig verstanden?

Gruß
Atalanttore
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. Der dekorator verarbeitet die in der KLASSE deklarierten Attribute, und fügt der Klasse dann neue Methoden hinzu. Das Schlüsselwort ist hinzufügen. Nicht ausführen. Es ist eine Modifikation der Klasse, so als ob man eben setter und getter für Properties geschrieben hätte.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Warum muss man Methoden, die innerhalb einer Klasse definiert sind, anschließend noch zur Klasse hinzufügen?

Gruß
Atalanttore
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil es keine Methoden sind. Wie sieht denn eine solche Deklaration aus? Sieht

player = attrib(...)

aus wie eine Methode?
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

`player = attrib(...)` sieht aus wie eine „Art von Zuweisung“. :wink:

Also sorgt der Dekorator `@attrs` dafür, dass die den Attributen (u.a. `player`) zugewiesenen `attrib()`-Funktionen zu Methoden der jeweiligen Klasse werden. Stimmt das so?

Gruß
Atalanttore
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

attrib() sind auch keine Funktionen, sondern Instanzen.

Code: Alles auswählen

def foobar():
    pass
ist eine Funktion.

Code: Alles auswählen

a = foobar()
ist *keine* Funktion, sondern a enthaelt nun, was der AUFRUF der Funktion foobar zurueckgeliefert hat. In diesem Fall None. Im Fall einer Klasse foobar eine Instanz. Oder was auch immer foobar macht. Nun kann ich natuerlich in foobar eine Funktion zurueckgeben.... aber das ist in diesem Fall ja eher unwahrscheinlich.

Das Objekt, das von attrib zurueckgeben wird, beschreibt nunmal was ich mir von diesem Attribut verspreche. Den Defaultwert, und ggf.welchen Typ es hat, etc... da hilft einem eine Funktion ja herzlich wenig bei. Was das ist kannst du selbst ausprobieren, aber es wird einfach wohl eine Instanz eben eines attrib-Objektes sein.

Aber ja, DANN wertet der Dekorator diese Deklarationen aus, und erzeugt entsprechend Methoden und Properties. Du kannst auch einfach mal in den Code schauen. Der ist ja open source.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Einfach mal live aufrufen bringt das hier:

Code: Alles auswählen

In [156]: a = attr.attrib(default=42)

In [157]: a
Out[157]: _CountingAttr(counter=14, _default=42, repr=True, cmp=True, hash=None, init=True, metadata={})
Die Funktion `attrib()` liefert also ein `_CountintAttr`-Objekt wo die Informationen drin stehen die der Klassendekorator dann später verwendet.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Vielen Dank für die Erklärungen. So ganz ist es mir aber immer noch nicht klar:
__deets__ hat geschrieben: Montag 25. Februar 2019, 16:22 attrib() sind auch keine Funktionen, sondern Instanzen.
__blackjack__ hat geschrieben: Montag 25. Februar 2019, 17:52 Die Funktion `attrib()` liefert also ein `_CountintAttr`-Objekt wo die Informationen drin stehen die der Klassendekorator dann später verwendet.
:?

Gruß
Atalanttore
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du schreibst das die "zugewiesenen `attrib()`-Funktionen" ausgewertet werden. Ist ein _CountintAttr-Objekt eine Funktion? Nein. Es ist eine Instanz. Wo auch immer du da jetzt einen Widerspruch konstruierst... es ist keiner. Ich sage ja sogar explizit, das ich nicht weiss, ob attrib eine Klasse ist, oder eine Funktion, die Objekte erzeugt. Und __blackjack__ hat dann belegt, dass es halt das letztere ist.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Die Theorie dahinter habe ich dann verstanden.

In der Praxis hatte ich noch nie das Bedürfnis nach einer Funktion, die ein Objekt zurückliefert, mit dem ein Klassendekorator anschließend Methoden und Properties zu einer Klasse hinzufügt.

Gruß
Atalanttore
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich hatte bis vor kurzem noch nie das Beduerfnis, einen 3D-Druck anzufertigen. Hat sich durch ein Projekt an dem ich gearbeitet habe geaendert. Die wenigsten Beduerfnisse die man so hat sind von Anfang an in einem vorhanden. Aber nur in der Hoehle liegen, Mammutkeule mampfen und sich fortpflanzen reicht halt den wenigsten auf Dauer ;)
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Atalanttore: Ich selbst habe das auch noch nicht gemacht, aber schon mehrere Bibliotheken verwendet die das machen. Ist halt praktisch für ”deklarative” Sachen wie eben hier oder bei ORMs oder Validierungs-/Konvertierungsbibliotheken. Wobei es nicht immer ein Klassendekorator ist. Ableiten von einer Klasse beziehungsweise eine Metaklasse sind ja auch Möglichkeiten das Verarbeiten der ”speziellen” Klassenattribute zu realisieren.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

__blackjack__ hat geschrieben: Freitag 22. Februar 2019, 12:52 Man hätte das auch mit einer Basisklasse oder einer Metaklasse lösen können, aber als Dekorator ist es flexibler. Zum Beispiel wenn man es mit einer Klasse verwenden möchte, wo man schon ähnliche ”Magie” verwendet wie bei den meisten ORMs.
Verwendet man `attrib()`-Funktionen immer dann, wenn man etwas einbindet, wo `attrib()`-Funktionen auch verwendet werden?

Nebenfrage: Sollte der eigene Code grundsätzlich ähnlich aufgebaut sein wie der Code eingebundener Bibliotheken?

Gruß
Atalanttore
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Atalanttore: Die erste Frage verstehe ich nicht. Was sind `attrib()`-Funktionen? `attr.attrib()` ist letztendlich eine ganz normale Funktion.

Bei der Nebenfrage würde ich sagen nein, denn eine eingebundene Bibliothek kann ja auch ganz schlecht aufgebaut sein. Das muss man ja nicht übernehmen für den eigenen Code.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten