私はPythonで "名前のマングリング"の概念を理解していると思うが、おそらく私が見逃したことがある。ここで私が得る出力二重アンダースコアでクラス属性を継承する
#!/usr/bin/env python
class Base(object):
__data = "Base"
@classmethod
def func(cls):
return "Class name is {}, data is {}".format(cls.__name__, cls.__data)
class A(Base):
__data = "A"
class B(A):
__data = "B"
print Base.func()
print A.func()
print B.func()
次のコードを見てみましょう
今Class name is Base, data is Base
Class name is A, data is Base
Class name is B, data is Base
を、私は各クラスのクラス属性の実際の名前が_<Class name>__data
にマングルされていることを理解しています。だから、例えば、ベースのためには、など、それは_A__data
だろうAのために、_Base__data
だろう
私の質問はいつもcls.__data
func
の内側にそれを正しく継承したクラス(ベース、A及びB)の名前を特定し、ですが、 cls._Base__data
につながります。何故ですか?私は、__name__
がAかBならば、私はクラスAかBの中にいることを知っているので、cls.__data
はそれぞれAかBのどちらかになると思います。私はここで何が欠けていますか?
あなたはそれが**行うには、まさにそれが**はずのだということを逃しています。基底のメソッドの中では、同じ名前のサブクラス属性との衝突を避けるために常に '' _Base ''でマングルされます。 – jonrsharpe