実行時に拡張したいpythonクラス階層があります。さらに、この階層のすべてのクラスには、すべてのサブクラスで上書きしたい静的属性「dict」があります。簡単に言うと、次のようになります。
'dict' は保護された (公開されていますが、先頭にアンダースコアが付いている) メンバーです
class A(object):
_dict = {}
@classmethod
def getdict(cls):
return cls._dict
@classmethod
def setval(cls, name, val):
cls._dict[name] = val
@classmethod
def addchild(cls, name):
return type(name, (cls, ), { '_dict' : {} })
B = A.addchild('B')
A.setval(1, 5)
print A.getdict()
# prints: {1: 5}
# like expected
print B.getdict()
# prints: {}
# like expected
これは期待どおりに機能します。問題は、次のとおりです。属性をプライベートに宣言すると、なぜ機能しなくなるのですか。
プライベートメンバーである「dict」と同じこと
class C(object):
__dict = {}
@classmethod
def getdict(cls):
return cls.__dict
@classmethod
def setval(cls, name, val):
cls.__dict[name] = val
@classmethod
def addchild(cls, name):
return type(name, (cls, ), { '__dict' : {} })
D = C.addchild('D')
C.setval(1, 5)
print C.getdict()
# prints: {1: 5}
# like expected
print D.getdict()
# prints: {1: 5}
# why!?
突然D
、 のサブクラスのC
'dict' の値がそのスーパークラスと同じになる!?
誰か親切に説明してくれませんか、これの理由は何ですか?前もって感謝します!