2017-08-24 22 views
1

Animalクラスを継承するDogクラスを使って基本的なPython継承を試しています。何らかの理由で、私のDogオブジェクトがnameを正しく継承していないので、私はAttributeError: 'Dog' object has no attribute '_Dog__name'を得続けます。誰が何が起こっているかも知っていますか?私のコードは以下の通りです:Pythonの継承 - オブジェクトに属性エラーがありません

class Animal(object): 
    __name = None #signifies lack of a value 
    __height = 0 
    __weight = 0 
    __sound = 0 

    def __init__(self, name, height, weight, sound): 
     self.__name = name 
     self.__height = height 
     self.__weight = weight 
     self.__sound = sound 


class Dog(Animal): 
    def __init__(self, name, height, weight, sound, owner): 

     super(Dog, self).__init__(name, height, weight, sound) 

     self.__owner = owner 
     #self.__name = name this works if I uncomment this line. 

    __owner = "" 

    def toString(self): 
     return "{} belongs to {}".format(self.__name, self.__owner) 
     #return 'Sup dawg' 

fido = Dog("Spot", 3, 4, "Woof", "John") 

print(fido.toString()) 
+0

**実際に何かを理解していない限り、ダブルアンダースコアネームマングリングを使用しないでください!これは、「プライベート」アクセス修飾子と同じではありません。また、インスタンス変数でシャドーするクラス変数は使用しないでください。 Python!= Java –

+0

**このチュートリアルは使用しないでください**。 Pythonのプログラマーではない人物であり、多分Javaコードを書く人かもしれません。私は真剣に、 'toString'を意味しますか? –

答えて

4

__ -prefixed属性名の目的は、サブクラスがないが簡単に誤って上書きされないように、それらにアクセスできるように、それらをめちゃくちゃすることです。

def toString(self): 
    return "{} belongs to {}".format(self._Dog__name, self.__owner) 

が、あなたは本当にただの接頭辞を省略し、定期的な名前を使用する必要があります。エラーメッセージは、直接それを使うことができるように、親クラスは、名前を狂わせる方法を示します。また、toStringメソッドを定義しないでください。代わりに__str__を使用してください。クラスレベルのイニシャライザも不要です。

class Animal(object): 
    def __init__(self, name, height, weight, sound): 
     self.name = name 
     self.height = height 
     self.weight = weight 
     self.sound = sound 

class Dog(Animal): 
    def __init__(self, name, height, weight, sound, owner): 
     super(Dog, self).__init__(name, height, weight, sound) 
     self.owner = owner 

    def __str__(self): 
     return "{} belongs to {}".format(self.name, self.owner) 

fido = Dog("Spot", 3, 4, "Woof", "John") 
print(fido) # print will convert fido to a string implicitly, using its __str__ method 
関連する問題