7

オーバーライドが発生しない可能性はありますか? 例えば:

class A:
    def __init__(self, name):
        self.name = name

class B(A):
    def __init__(self, name):
        A.__init__(self, name)
        self.name = name + "yes"

self.nameクラス B をクラス A のクラスから独立させる方法はありますか、それとも別の名前を使用することが義務付けられていますか?

4

1 に答える 1

10

名前の前に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。これは多くの場合、必要なものです。それらを別々にしたいが、同じ変数名を使用する場合は、下線を使用します

于 2012-08-13T00:58:49.500 に答える