@__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
Spielfeld Objektorientiert darstellen
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.
-
- 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
Gruß
Atalanttore
-
- User
- Beiträge: 407
- Registriert: Freitag 6. August 2010, 17:03
`player = attrib(...)` sieht aus wie eine „Art von Zuweisung“.
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
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
attrib() sind auch keine Funktionen, sondern Instanzen.
ist eine Funktion.
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.
Code: Alles auswählen
def foobar():
pass
Code: Alles auswählen
a = foobar()
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.
- __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:
Die Funktion `attrib()` liefert also ein `_CountintAttr`-Objekt wo die Informationen drin stehen die der Klassendekorator dann später verwendet.
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={})
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
-
- 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:
Gruß
Atalanttore
__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
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.
-
- 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
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
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
- __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
-
- User
- Beiträge: 407
- Registriert: Freitag 6. August 2010, 17:03
Verwendet man `attrib()`-Funktionen immer dann, wenn man etwas einbindet, wo `attrib()`-Funktionen auch verwendet werden?__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.
Nebenfrage: Sollte der eigene Code grundsätzlich ähnlich aufgebaut sein wie der Code eingebundener Bibliotheken?
Gruß
Atalanttore
- __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.
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