名前の前に2つのアンダースコアを付けると、名前がマングリングされます。これは、希望どおりのようです。例えば
class A:
def __init__(self, name):
self.__name = name
def print_name(self):
print self.__name
class B(A):
def __init__(self, name):
A.__init__(self, name)
self.__name = name + "yes"
def print_name(self):
print self.__name
def print_super_name(self):
print self._A__name #class name mangled into attribute
クラス定義内で、(メソッド__name
のように)通常どおりアドレス指定できます。print_name
サブクラス、およびクラス定義以外の場所では、クラスの名前は、前にアンダースコアが付いた属性名にマングルされます。
b = B('so')
b._A__name = 'something'
b._B__name = 'something else'
投稿したコードでは、サブクラス属性がスーパークラスのをオーバーライドしますname
。これは多くの場合、必要なものです。それらを別々にしたいが、同じ変数名を使用する場合は、下線を使用します