Die kurze Antwort: Es gibt keine Möglichkeit, benutzerdefinierte Attribute zu gebundenen Methoden hinzuzufügen.
Die lange Antwort folgt.
In Python gibt es Funktionsobjekte und Methodenobjekte. Wenn Sie eine Klasse definieren, erstellt die def
-Anweisung ein Funktionsobjekt, das im Namensraum der Klasse existiert:
>>> class c:
... def m(self):
... pass
...
>>> c.m
Funktionsobjekte verfügen über ein spezielles __dict__
-Attribut, das benutzerdefinierte Attribute speichern kann:
>>> c.m.i = 0
>>> c.m.__dict__
{'i': 0}
Methodenobjekte sind unterschiedliche Tiere. Sie sind winzige Objekte, die lediglich eine Referenz auf das entsprechende Funktionsobjekt (__func__
) und eine auf ihr Hostobjekt (__self__
) halten:
>>> c().m
>
>>> c().m.__self__
<__main__.c object at 0x02625070>
>>> c().m.__func__
>>> c().m.__func__ is c.m
True
Methodenobjekte verfügen über ein spezielles __getattr__
, das den Attributzugriff an das Funktionsobjekt weiterleitet:
>>> c().m.i
0
Dies gilt auch für die __dict__
-Eigenschaft:
>>> c().m.__dict__['a'] = 42
>>> c.m.a
42
>>> c().m.__dict__ is c.m.__dict__
True
Das Setzen von Attributen folgt jedoch den Standardregeln, und da sie keinen eigenen __dict__
haben, gibt es keinen Weg, willkürliche Attribute festzulegen.
Dies ähnelt userdefinierten Klassen, die __slots__
definieren und keinen __dict__
-Slot haben, wenn beim Versuch, einen nicht vorhandenen Slot zu setzen, ein AttributeError
ausgelöst wird (siehe die Dokumentation zu __slots__
für weitere Informationen):
>>> class c:
... __slots__ = ('a', 'b')
...
>>> x = c()
>>> x.a = 1
>>> x.b = 2
>>> x.c = 3
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'c' object has no attribute 'c'
0 Stimmen
Warum brauchst du das? Warum nicht Instanzattribute verwenden? Wie
self.m_i = 0
oderself.m_data = { 'i': 0 }
, wenn du viele Attribute pro Methode möchtest.0 Stimmen
@eye Danke für Ihr Interesse. Ich versuche, statische Funktionsvariablen gemäß stackoverflow.com/questions/279561/… zu implementieren, aber das funktioniert auch ordnungsgemäß mit Methoden. Ich habe den Großteil der Implementierung, aber dies ist ein Knackpunkt. Es könnte jedoch einen besseren Weg geben, das ursprüngliche Problem zu lösen.