Ich möchte ein Attribut für jede Klasse hinzufügen, die von einer Metaklasse erstellt wurde. Wenn beispielsweise eine Klasse mit dem Namen C
erstellt wird, möchte ich ein Attribut C._C__sup
hinzufügen, dessen Wert der Deskriptor super(C)
ist. HierPython __super black magic ist fehlgeschlagen
ist, was ich versucht habe:
class Meta(type):
def __init__(cls, name, bases, dict): # Not overriding type.__new__
cls.__dict__['_' + name + '__sup'] = super(cls)
# Not calling type.__init__; do I need it?
class C(object):
__metaclass__ = Meta
c = C()
print c._C__sup
Das gibt mir:
TypeError: Error when calling the metaclass bases
'dictproxy' object does not support item assignment
Einige Hintergrundinformationen:
(Sie nicht, diesen Teil lesen)
Inspiriert von this article, was ich tue versucht, „Hardcoding“ den Klassennamen zu vermeiden, wenn super
mit:
Die Idee gibt es die ungebundenen Super Objekte als private Attribute zu verwenden ist.
>>> C._C__sup = super(C)
Mit dieser Definition in den Methoden die Syntax
self.__sup.meth
kann als Alternative verwendet werden: Zum Beispiel in unserem Beispiel könnten wir das private Attribut__sup
in der KlasseC
als ungebundenes Super Objektsuper(C)
definieren zusuper(C, self).meth
. Der Vorteil ist, dass Sie vermeiden, den Namen der Klasse in der aufrufenden Syntax zu wiederholen, da dieser Name im Mangelmechanismus von privaten Namen versteckt ist. Die Attribute__sup
können in einer Metaklasse versteckt und automatisch gemacht werden. Also, das scheint zu funktionieren: aber eigentlich ist das nicht der Fall.