Python继承返回属性错误

Flu*_*ert 5 python inheritance

刚刚开始学习 Python,我是 Derek Banas 的粉丝,一直在遵循教程,但我被一些代码困住了。

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())
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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'
Run Code Online (Sandbox Code Playgroud)

由于我之前已经从 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)
Run Code Online (Sandbox Code Playgroud)

Ana*_*mar 5

您的Animal班级正在使用Name Mangling。来自文档-

由于类私有成员有一个有效的用例(即避免名称与子类定义的名称发生名称冲突),因此对这种称为name mangling的机制的支持有限。该形式的任何标识符__spam(至少两个前导下划线,最多一个尾随下划线)在文本上都替换为_classname__spam,其中 classname 是删除了前导下划线的当前类名称。

(强调我的)

因此,在Animal定义您的类后,任何名称(例如)__name都会更改为_Animal__name等。您还需要像在Dog类中一样访问它们。

但我认为您实际上不需要使用Name Mangling,如果您不想发生Name Mangling ,则应该避免使用两个前导下划线。