Я хочу добавить атрибут для каждого класса, созданного метаклассом. Например, когда создается класс с именем C
, я хочу добавить атрибут C._C__sup
, значением которого является дескриптор super(C)
.Ошибка Python __super черной магии
Вот что я пробовал:
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
Это дает мне:
TypeError: Error when calling the metaclass bases
'dictproxy' object does not support item assignment
Некоторые справочная информация:
(Вы не должны читать эту часть)
Вдохновленный по this article, что я делаю пытаемся избежать «жестко прописывать» имя класса при использовании super
:
Идеи есть использовать несвязанные супер объекты, как частные атрибутов. Например, в нашем примере, мы могли бы определить частный атрибут
__sup
в классеC
как несвязанный супер объектsuper(C)
:>>> C._C__sup = super(C)
С этим определением внутри методов синтаксис
self.__sup.meth
может быть использован в качестве альтернативы доsuper(C, self).meth
. Преимущество заключается в том, что вы избегаете повторения имени класса в синтаксисе вызывающего , поскольку это имя скрыто в механизме переключения частных имен . Создание атрибутов__sup
можно скрыть в метаклассе и сделать автоматическим. Итак, все это, похоже, сработало: но фактически это не тот случай.