Python 子类未正确继承超类的结构

Python 子类未正确继承超类的结构,python,name-mangling,Python,Name Mangling,我刚刚开始学习Python,但是我不明白为什么我在使用如此简单的类继承时会遇到问题,尽管我一直在使用教程,但我还没有看到其他任何人在堆栈溢出中遇到这个问题。下面是代码(别担心,没什么太复杂的): …以下是输出: Whiskers is 33 cm tall and 10 kilograms and says meow Flutie is 33 cm tall and 10 kilograms and says tweet Traceback (most recent call last):

我刚刚开始学习Python,但是我不明白为什么我在使用如此简单的类继承时会遇到问题,尽管我一直在使用教程,但我还没有看到其他任何人在堆栈溢出中遇到这个问题。下面是代码(别担心,没什么太复杂的):

…以下是输出:

Whiskers is 33 cm tall and 10 kilograms and says meow
Flutie is 33 cm tall and 10 kilograms and says tweet
Traceback (most recent call last):
  File "C:/.../animal_test.py", line 72, in <module>
    print(spot.toString())
  File "C:/.../animal_test.py", line 65, in toString
    return "{} is {} cm tall and {} kilograms and says {}".format(self.__name,
AttributeError: 'Dog' object has no attribute '_Dog__name'
胡须有33厘米高,10公斤重,会叫喵喵
Flutie身高33厘米,体重10公斤,他在推特上说
回溯(最近一次呼叫最后一次):
文件“C:/…/animal_test.py”,第72行,在
打印(spot.toString())
文件“C:/…/animal_test.py”,第65行,在toString中
返回“{}是{}厘米高和{}公斤,并表示{}”,
AttributeError:“Dog”对象没有属性“\u Dog\u name”

双下划线表示

当被解释时,字面翻译为:

class Animal:
    def __init__(self, name, height, weight, sound):
        self._Animal__name = name
        self._Animal__height = height
        self._Animal__weight = weight
        self._Animal__sound = sound
无论在哪里调用,或者谁调用了
\uuuuu init\uuuu
,前缀
\u Animal
都会出现,因为它实际位于
Animal
类下

但是,当您在此处使用属性时,由于它实际位于
Dog
类下,因此get名称被损坏为:

class Dog(Animal):

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

    def toString(self):
        return "{} is {} cm tall and {} kilograms and says {}".format(self._Dog__name,
                                                                      self._Dog__height,
                                                                      self._Dog__weight,
                                                                      self._Dog__sound)

其中,
Dog
对象肯定没有名为
self的属性。
,而是有
self的属性。

属性名称中的双下划线在python中有一个特殊的含义:除了名称混乱问题之外,在类级别probab设置
\uu name=''
等等ly不做您认为的事情,在这里没有任何用途,并且以后可能会导致问题。Python!=Java。停止编写双下划线名称损坏的属性,除非这是您想要的,您正在尝试创建类本地引用,这当然不是您想要的,因为您正在尝试访问subc中的属性lass.停止在类级别写入只在实例级别隐藏的属性,即
\uuu name=“”
这几乎肯定不是你认为它在做的事情。不要编写
toString
方法,使用
\uuuu str\uuuu
。出于好奇,你在遵循什么教程?@PlatypusEgg我对那个教程非常怀疑。只要快速看一下,这个人就有了用Python教你Java的所有经典迹象。不是吗在条件语句周围使用括号:
if(something就是something):
。它们使用了错误的分号结尾行。由于我上面提到的事情,类定义的示例完全不是Python的。他还教你编写getter和setter,这不是Python中的youdo封装。它们可能来自Java/C++中的任何一个。如果你想获得更好的Python教程学习Python。有趣。从所有属性中删除双下划线使代码正常工作,所以谢谢。我想我理解了名称混乱是如何导致问题的。我想我现在唯一的问题是为什么它也适用于我所遵循的高度可信的教程:。课程介绍从32分钟开始。他正在使用Python版本3.4.2…那个教程不是特别好…他犯了错误,但没有在视频中解释/捕捉它。在他的实际代码中,他调用了getter函数而不是下划线属性。也就是说,他在实际代码中这样做:
self.get\u name()
而不是
self.\u name()
Dog
类的
toString
字符串格式中,这是他的代码:,向下滚动到定义Dog类的位置,注意他的toString函数与视频的不同之处,“我打算继续观看教程,以便开始了解某些方法的一般首选项,但如果有,你会很高兴对于Python初学者(以及一般的非标记编程),我很想知道。我通过阅读大量书籍学习了Python:d,但官方Python教程非常简洁,代码学院有一个实践教程。对于视频教程,对不起,我没有任何偏好。。。
class Animal:
    def __init__(self, name, height, weight, sound):
        self._Animal__name = name
        self._Animal__height = height
        self._Animal__weight = weight
        self._Animal__sound = sound
class Dog(Animal):

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

    def toString(self):
        return "{} is {} cm tall and {} kilograms and says {}".format(self._Dog__name,
                                                                      self._Dog__height,
                                                                      self._Dog__weight,
                                                                      self._Dog__sound)