2015-10-14 71 views
2

刚刚开始Python,我是Derek Banas的粉丝,并且一直在关注教程,并且我坚持了一些代码。Python继承返回属性错误

class Dog(Animal): 
    __owner = "" 

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

    def set_owner(self, owner): 
     self.__owner = owner 

    def get_owner(self): 
     return self.__owner 

    def get_type(self): 
     print("Dog") 

    def tostring(self): 
     return "{} is {} cm tall and {} kilograms and say {} His owner is {}".format(self.__name, 
                        self.__height, 
                        self.__weight, 
                        self.__sound, 
                        self.__owner) 

    def multiple_sounds(self, how_many=None): 
     if how_many is None: 
      print(self.get_sound()) 
     else: 
      print(self.get_sound() * how_many) 

spot = Dog("Spot", 53, 27, "Ruff", "Seb") 

print(spot.tostring()) 

而且我收到以下错误:

Traceback (most recent call last): 
    File "G:/JetBrains/PyCharm Community Edition 4.5.4/PyCharm Projects/Testing 123/testing objects.py", line 87, in <module> 
    print(spot.tostring()) 
    File "G:/JetBrains/PyCharm Community Edition 4.5.4/PyCharm Projects/Testing 123/testing objects.py", line 73, in tostring 
    return "{} is {} cm tall and {} kilograms and say {} His owner is {}".format(self.__name, 
AttributeError: 'Dog' object has no attribute '_Dog__name' 

正如我之前从VB编程传输,为“的toString”方法的格式压痕挡板我一点点。我甚至试图把它全部放到一行中,但它仍然不能识别Animal类的继承属性'__name'。

帮助将不胜感激。

编辑:

这可能是值得一提,我使用Pycharm写这一切

而且这里的动物类

class Animal: 
    __name = "" 
    __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 

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

    def set_height(self, height): 
     self.__height = height 

    def set_weight(self, weight): 
     self.__weight = weight 

    def set_sound(self, sound): 
     self.__sound = sound 

    def get_name(self): 
     return self.__name 

    def get_height(self): 
     return self.__height 

    def get_weight(self): 
     return self.__weight 

    def get_sound(self): 
     return self.__sound 

    def get_type(self): 
     print("Animal") 

    def tostring(self): 
     return "{} is {} cm tall and {} kilograms and say {}".format(self.__name, 
                    self.__height, 
                    self.__weight, 
                    self.__sound) 
+1

由于名称在超集,我们可能需要看到'Animal'代码。顺便说一句,创建一个'tostring()'方法是非常不合理的,因为你会想要重写'__str__'和'__repr__'魔术方法。 –

+0

这是真的,不知道是否有必要,如果我说的是它试图找到的属性已经存在于它的继承中,但我会将Animal类代码添加到原始帖子中。 –

+1

如果你从教程中得到这个,你应该马上得到另一个*。这完全是非Pythonic代码。 –

回答

4

Animal类使用Name Mangling。从documentation -

(重点煤矿)

因此,后您Animal类得到了定义的任何名称,如__name会改为_Animal__name,等你还需要一样访问它们在你的Dog班。

但我不认为你真正需要使用名字改编,你应该避免使用两个前导下划线,如果不是故意名字改编发生。

+0

简而言之:使用单个尾部下划线,而不是双倍。 – bgusach

+0

谢谢,这似乎工作。名称是否改变了去年推出的内容?我问这个问题是因为在教程中我看到他们没有任何使用2个下划线来表示属性的问题。 –

0

孩子类本身没有属性,用它来代替。

return super(Dog, self).toString() + "His owner is {}".format(self.__owner)