メタクラスで作成されたすべてのクラスに属性を追加します。たとえば、C
という名前のクラスが作成されたときに、その値が記述子super(C)
である属性C._C__sup
を追加したいとします。ここでPython __super black magicが失敗しました
は、私が試したものです:
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
を使用するときに「ハードコーディング」クラス名を避けるためにしようとしている:
アイデアはプライベート 属性として結合していないスーパーのオブジェクトを使用することがあります。構文
self.__sup.meth
が代替として使用できるメソッド内でこの定義により>>> C._C__sup = super(C)
:たとえば、私たちの例では、我々は結合していないスーパーのオブジェクト
super(C)
としてクラスC
にプライベート 属性__sup
を定義することができます〜super(C, self).meth
。 の利点は、呼び出し元の 構文でクラスの名前を繰り返さないようにすることです。その名前は、 の名前のマージメカニズムで隠されているためです。__sup
属性の作成は、 メタクラスで非表示にして自動化することができます。だから、これはうまくいくようです:しかし、 実際にはそうではありません。