2017-01-02 5 views
0

これは継承を学習するためのPythonコードです。Python 3.5でsuper()を使用しているときの属性エラー

class Animal(): 
    __name= None 
    __sound = None 

    def __init__(self, name , sound): 
     self.__name= name 
     self.__sound = sound 
    def ToString(self): 
     print ("The {} has the sound {}".format(self.__name , 
               self.__sound)) 


cat = Animal('Tiger' , 'roars') 
cat.ToString() 


class Panther(Animal): 
    __owner = None 

    def __init__(self , name ,sound ,owner): 
     self.__owner = owner 
     super(Panther ,self).__init__(name, sound) 
    def ToString(self): 
     print(self.__owner) 
     print(self.__name) 

leopard = Panther('Leopard' , 'roars' , 'Senegal') 
leopard.ToString() 

しかし、私はPycharmでそれを実行しようとすると、私は次のエラーを取得する:

/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/venkat/PycharmProjects/PythonOneVideo/main.py The Tiger has the sound roars Senegal Traceback (most recent call last): File "/Users/venkat/PycharmProjects/PythonOneVideo/main.py", line 41, in leopard.ToString() File "/Users/venkat/PycharmProjects/PythonOneVideo/main.py", line 35, in ToString print(self.__name) AttributeError: 'Panther' object has no attribute '_Panther__name'

Process finished with exit code 1

スーパークラスのコンストラクタを呼び出すと間違って何? このエラーはなぜ発生したのですか? ご協力いただければ幸いです。

+0

可能な重複http://stackoverflow.com/question/1301346/the-one-a-double-under-an-object-in-an-python) –

答えて

4

いくつかの問題:

  • のpython superのための3構文:super().__init__(name, sound)
  • name mangling__で始まるインスタンス変数(2つのアンダースコア)には、_ClassNameが先頭に追加されます。子クラスは通常の方法でそれらにアクセスすることはできません。
  • ToString:なぜ__str____str__の中には印刷されず、ちょうどstrが返されます)?
  • とは何ですか?クラス変数(_nameなど)は何ですか?なぜインスタンス変数(self._name)としてそれらを持っていないのですか?これは、バスが不完全で働く

...

class Animal(): 
    # _name= None 
    # _sound = None 

    def __init__(self, name , sound): 
     self._name= name 
     self._sound = sound 

# def ToString(self): 
#  print ("The {} has the sound {}".format(self._name , 
#            self._sound)) 

    def __str__(self): 
     fmt = 'The {self._name} has the sound {self._sound}' 
     return fmt.format(self=self) 

cat = Animal('Tiger' , 'roars') 
print(cat) 

class Panther(Animal): 
    # _owner = None 

    def __init__(self , name ,sound ,owner): 
     self.__owner = owner 
     super().__init__(name, sound) 

# def ToString(self): 
#  # print(self._owner) 
#  print(self._name) 

leopard = Panther('Leopard' , 'roars' , 'Senegal') 
print(leopard) 
([シングルおよびPythonでオブジェクト名の前に二重アンダースコアの意味]の
1

あなたの属性から、アンダースコア先頭の2を削除します。

class Animal(): 
    name= None 
    sound = None 

    def __init__(self, name , sound): 
     self.name= name 
     self.sound = sound 
    def ToString(self): 
     print ("The {} has the sound {}".format(self.name , 
               self.sound)) 


cat = Animal('Tiger' , 'roars') 
cat.ToString() 


class Panther(Animal): 
    owner = None 

    def __init__(self , name ,sound ,owner): 
     self.owner = owner 
     super(Panther ,self).__init__(name, sound) 
    def ToString(self): 
     print(self.owner) 
     print(self.name) 

leopard = Panther('Leopard' , 'roars' , 'Senegal') 
leopard.ToString() 

出力:

The Tiger has the sound roars 
Senegal 
Leopard 

2つの先頭のアンダースコアは、あなたの属性が "プライベート" を作ります。 これは私のname manglingで行われます。すなわち、2つの先行アンダースコアを持つすべての属性の前に_ClassNameを追加します。これは、あなたが仕事から継承するのを防ぎます。

+0

ありがとうMike.It助けて –

+0

これはPythonのものです。他の言語のプライベート属性と同様に使用できます。 –

0

あなたのエラーは、__という変数名の前にPythonが実行するmanglingという名前に由来します。

class Animal(): 
    def __init__(self, name , sound): 
     self._name= name 
     self._sound = sound 
    def ToString(self): 
     print ("The {} has the sound {}".format(self._name , 
               self._sound)) 


cat = Animal('Tiger' , 'roars') 
cat.ToString() 


class Panther(Animal): 

    def __init__(self , name ,sound ,owner): 
     self._owner = owner 
     super(Panther ,self).__init__(name, sound) 
    def ToString(self): 
     print(self._owner) 
     print(self._name) 

と出力します::ダブル末尾にアンダースコアなしであなたは、単に名前を使用している場合、これは正常に動作します

>>> leopard = Panther('Leopard' , 'roars' , 'Senegal') 
>>> leopard.ToString() 
The Tiger has the sound roars 
Senegal 
Leopard 
関連する問題