Seite 2 von 2

Re: Spielfeld Objektorientiert darstellen

Verfasst: Freitag 22. Februar 2019, 15:24
von Atalanttore
@__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

Re: Spielfeld Objektorientiert darstellen

Verfasst: Freitag 22. Februar 2019, 15:29
von __deets__
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.

Re: Spielfeld Objektorientiert darstellen

Verfasst: Sonntag 24. Februar 2019, 21:02
von Atalanttore
Warum muss man Methoden, die innerhalb einer Klasse definiert sind, anschließend noch zur Klasse hinzufügen?

Gruß
Atalanttore

Re: Spielfeld Objektorientiert darstellen

Verfasst: Sonntag 24. Februar 2019, 21:22
von __deets__
Weil es keine Methoden sind. Wie sieht denn eine solche Deklaration aus? Sieht

player = attrib(...)

aus wie eine Methode?

Re: Spielfeld Objektorientiert darstellen

Verfasst: Montag 25. Februar 2019, 16:01
von Atalanttore
`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

Re: Spielfeld Objektorientiert darstellen

Verfasst: Montag 25. Februar 2019, 16:22
von __deets__
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.

Re: Spielfeld Objektorientiert darstellen

Verfasst: Montag 25. Februar 2019, 17:52
von __blackjack__
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.

Re: Spielfeld Objektorientiert darstellen

Verfasst: Dienstag 26. Februar 2019, 15:50
von Atalanttore
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

Re: Spielfeld Objektorientiert darstellen

Verfasst: Dienstag 26. Februar 2019, 16:01
von __deets__
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.

Re: Spielfeld Objektorientiert darstellen

Verfasst: Dienstag 26. Februar 2019, 16:16
von Atalanttore
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

Re: Spielfeld Objektorientiert darstellen

Verfasst: Dienstag 26. Februar 2019, 16:18
von __deets__
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 ;)

Re: Spielfeld Objektorientiert darstellen

Verfasst: Dienstag 26. Februar 2019, 18:11
von __blackjack__
@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.

Re: Spielfeld Objektorientiert darstellen

Verfasst: Mittwoch 27. Februar 2019, 15:59
von Atalanttore
__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

Re: Spielfeld Objektorientiert darstellen

Verfasst: Mittwoch 27. Februar 2019, 16:18
von __blackjack__
@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.