2017-06-08 4 views
1

私は基本的な継承を学ぼうとしています。スーパークラスとベースクラスに同じ名前の属性を持たせたいが、インスタンス。以下は、私がこのアイデアを実験するために書いたコードです。スーパークラスとベースクラスは同じ属性名の別のインスタンスを持つ必要があります

class master(object): 

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

    def print_name(self): 
     print (self.name) 

class slave(master): 

    def __init__(self, master_name, slave_name): 

     self.name = slave_name 
     super(slave, self).__init__(master_name) 

    def print_name(self): 

     super(slave, self).print_name() 
     print (self.name) 

def main(): 
    obj = slave('hello', 'world') 
    obj.print_name() 

if __name__ == '__main__': 
    main() 

アウト私は取得しています置くがある: こんにちは ハロー

しかし、私は出力が 世界になりたい ハロー

答えて

0

masterから__init__self.nameの値をオーバーライドしているしたいですslaveに設定されています。異なる変数名を使用する必要があります。

1

スーパークラスとベースクラスは同じものの異なる名前です。この場合はmasterクラスです。これは、slaveの基本クラスとそのスーパークラスです。

あなたはクラスではなく、同時にmasterslaveのインスタンスであるインスタンスobj、上に同じ名前の属性を持つことができます。したがって、両方の方法でselfmaster.print_name()slave.print_name()は非常に同じオブジェクトを指します。

オブジェクトの属性には特定の時間に1つの値しか割り当てられないため、異なる名前が必要です。しかし、2つの主要なアンダースコアで属性のためにシーンの裏で行われる名前のマングリングで同じ名前の外観を得ることができます:

class Master(object): 

    def __init__(self, name): 
     self.__name = name 

    def print_name(self): 
     print self.__name 


class Slave(Master): 

    def __init__(self, master_name, slave_name): 

     self.__name = slave_name 
     Master.__init__(self, master_name) 

    def print_name(self): 

     Master.print_name(self) 
     print self.__name 


def main(): 
    obj = Slave('hello', 'world') 
    obj.print_name() 
    # The *actual* names of the attributes: 
    print obj._Master__name, obj._Slave__name 


if __name__ == '__main__': 
    main() 
関連する問題