Python继承返回属性错误 [英] Python inheritance returns attribute error

查看:103
本文介绍了Python继承返回属性错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

刚刚开始使用Python,我是Derek Banas的粉丝并且一直在关注一个教程并且我遇到了一些代码。

Just starting out Python, i'm a fan of Derek Banas and have been following a tutorial and I'm stuck with a bit of code.

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'。

As I've previously transferred from programming with vb, the indentation for the format of the 'tostring' method baffles me a little bit. I even tried putting it all into one line and it still doesn't recognize the inherited attribute '__name' from the class Animal.

帮助将不胜感激。

编辑:

值得一提的是,我正在使用Pycharm来写这些内容。

It might be worth mentioning that i'm using Pycharm to write all this in.

此处还有动物类

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)


推荐答案

您的 Animal 类正在使用 名称管理 。来自文档 -

Your Animal class is using Name Mangling. From documentation -


由于类私有成员有一个有效的用例(即为了避免名称与子类定义的名称冲突),对这种机制的支持有限,称为名称修改 __ spam 形式的任何标识符(至少两个主要下划线,最多一个尾随下划线)在文本上替换为 _classname__spam ,其中classname是当前的类名,前导下划线被剥离。

Since there is a valid use-case for class-private members (namely to avoid name clashes of names with names defined by subclasses), there is limited support for such a mechanism, called name mangling. Any identifier of the form __spam (at least two leading underscores, at most one trailing underscore) is textually replaced with _classname__spam, where classname is the current class name with leading underscore(s) stripped.

(强调我的)

因此,在您的 Animal 类定义了任何名称后,例如 __ name 已更改为 _Animal__name 等等。您还需要在 Dog中访问它们 class。

Hence , after your Animal class got defined any name such as __name would have changed to _Animal__name , etc. You would also need to access them alike that in your Dog class.

但我认为你实际上不需要使用 Name Mangling ,你应该避免使用两个领先的下划线,如果你不是指 Name Mangling 发生。

But I don't think you actually need to use Name Mangling , you should avoid using the two leading underscores, if you didn't mean for Name Mangling to happen.

这篇关于Python继承返回属性错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆