Attribute in Python
Bindungstabellen
Wie schon früher behandelt wurde, verfügt jedes Modul über eine Bindungstabelle, welche zu jedem Namen das Objekt enthält, an welches er gebunden ist.
- Bindungstabelle (in symbolischer Darstellung)
-|--------------|-----------------|-
| erster Name | erstes Objekt |
-|--------------|-----------------|-
| zweiter Name | zweites Objekt |
-|--------------|-----------------|-
| dritter Name | drittes Objekt |
-|--------------|-----------------|-
| u.s.w. | u.s.w. |
In der Konsole findet man beispielsweise, daß der Name »__name__« vermittels der Bindungstabelle des Moduls an die Zeichenfolge »__main__« gebunden ist.
- Bindungstabelle (in symbolischer Darstellung)
-|--------------|-----------------|-
| __name__ | "__main__" |
-|--------------|-----------------|-
Wird ein Name ausgewertet, ergibt sich dann als Wert für den Namen das Objekt, an das er gebunden ist.
- Protokoll
__name__
'__main__'
Mit dem Begriff „Attribut eines Objekts“ meint man – je nach Zusammenhang – entweder einen Namen aus der Bindungstabelle des Objektes (den Attributnamen ) oder das Objekt an das ein solcher Name gebunden ist (den Attributwert ) oder die Paarung aus diese beiden (den Attributeintrag in der Bindungstabelle).
Oft stellen wir uns vor, daß die Attribute in dem Objekt enthalten sind, in dessen Bindungstabelle sie eingetragen sind.
Objekte als Bindungstabellen
Jedes Objekt enthält eine Bindungstabelle, die zum Nachschlagen eines Namens genutzt werden kann.
›dir‹
Die Funktion ›dir‹ ergibt eine Liste mit den Namen der Bindungstabelle ihres Argumentobjekts.
- Protokoll (gekürzt)
dir( 1 )
[…, 'as_integer_ratio', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
- Protokoll
"numerator" in dir( 1 )
True
- Protokoll
"numberator" in dir( 1 )
False
›hasattr‹
- Ein aufrufbares Objekt nennen wir hier auch einen „Funktor“.
- Einen Funktor, der mit zwei Argumenten aufgerufen werden kann, nennen wir auch einen zweistelligen Funktor.
- Einen Funktor, dessen Ergebnis den Typ ›bool‹ hat, nennen wir auch einen wahrheitswertigen Funktor.
- Einen zweistelligen wahrheitswertigen Funktor nennen wir hier auch eine Relation.
Die Funktion ›hasattr‹ ist eine Relation, die besagt, ob das zweite Argument ein Attribut des ersten Arguments ist.
- Protokoll
hasattr( 1, "numerator" )
True
- Protokoll
hasattr( 1, "numberator" )
False
›getattr‹
- Ein aufrufbares Objekt nennen wir hier auch einen „Funktor“.
- Einen Funktor, der mit zwei Argumenten aufgerufen werden kann, nennen wir auch einen zweistelligen Funktor.
Die Funktion ›getattr‹ ist ein zweistelliger Funktor, der das Objekt ergibt, an welches das zweite Argument in der Bindungstabelle des ersten Arguments gebunden ist.
- Protokoll
getattr( 1, "numerator" )
1
- Protokoll (übersetzt)
getattr( 1, "nummerator" )
AttributeError: 'int'-Objekte haben kein Attribut 'nummerator'.
›setattr‹
- Ein aufrufbares Objekt nennen wir hier auch einen „Funktor“.
- Einen Funktor, der mit drei Argumenten aufgerufen werden kann, nennen wir auch einen dreistelligen Funktor.
Die Funktion ›setattr‹ ist ein dreistelliger Funktor, der das zweite Argument in der Bindungstabelle des ersten Arguments an das dritte Argument bindet.
- Protokoll
o = lambda: None
hasattr( o, "Beispiel" )
False
setattr( o, "Beispiel", 427 )
hasattr( o, "Beispiel" )
True
getattr( o, "Beispiel" )
427
In vielen Fällen können Attribute aber nicht so einfach zu Objekten hinzugefügt werden.
- Protokoll (übersetzt)
setattr( 1, "numerator", 2 )
AttributeError: Das Attribut 'numerator' von 'int'-Objekten ist nicht änderbar.
- Protokoll (übersetzt)
setattr( 1, "numerator", 2 )
AttributeError: 'int'-Objekte haben kein Attribut 'Beispiel'
Übungsaufgaben
? Wert- und Wirkaufrufe
Ein Wertaufruf ist ein Aufruf, dessen Auswertung einen anderen Wert als ›None‹ ergibt.
Ein Wirkaufruf ist ein Aufruf, dessen Auswertung (laut der Dokumentation des Aufgerufenem) etwas verändert.
- Ist ein Aufruf von ›getattr‹ ein Wertaufruf?
- Ist ein Aufruf von ›getattr‹ ein Wirkaufruf?
- Ist ein Aufruf von ›setattr‹ ein Wertaufruf?
- Ist ein Aufruf von ›setattr‹ ein Wirkaufruf?
/ Übungsaufgabe
Ermitteln Sie den Typ des Attributs ›nan‹ des Objekts ›math‹ nach Ausführung der Anweisung »import math«.
/ Übungsaufgabe
Lassen Sie die Anweisung »import math« ausführen.
Rufen Sie dann den Funktor ›help‹ mit dem Wert des Attributs ›factorial‹ des Objekts ›math‹ als Argument auf.
Rufen Sie dann das Attribut ›factorial‹ des Objekts ›math‹ auf.
/ Übungsaufgabe
Rufen Sie den Funktor ›help‹ mit dem Wert des Attributs ›capitalize‹ des Wertes «"abc"» als Argument auf.
Rufen Sie dann das Attribut ›capitalize‹ des Wertes «"abc"» auf.