python中的继承,属性错误

python中的继承,属性错误,python,Python,我最近开始学习python,我很难理解继承在python中是如何工作的 我创建了两个类,一个名为Animal,另一个名为Dog。Dog类继承了Animal类。我有一些属性,如名称,身高,声音等在动物类,我想在狗类使用。我正在使用动物类的init方法设置属性 class Animal: __name = "" __height = 0 __weight = 0 __sound = 0 def __init__(self, name, height, wei

我最近开始学习python,我很难理解继承在python中是如何工作的

我创建了两个类,一个名为Animal,另一个名为Dog。Dog类继承了Animal类。我有一些属性,如名称,身高,声音等在动物类,我想在狗类使用。我正在使用动物类的init方法设置属性

class Animal:
    __name = ""
    __height = 0
    __weight = 0
    __sound = 0

    def __init__(self, name, height, weight, sound):
        self.__name = name
        self.__height = height
        self.__wight = weight
        self.__sound = sound

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

    def get_name(self):
        return self.__name

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

    def get_height(self):
        return self.__height

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

    def get_weight(self):
        return self.__weight

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

    def get_sound(self):
        return self.__sound

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

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


cat = Animal("whiskers", 50, 20, "meow")
print(cat.tostring())


class Dog(Animal):
    __owner = None

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

    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 says {} 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)
my_dog = Dog("spot", 50, 40, "Ruff", "Derek")
print(my_dog.tostring())
问题是,当我尝试使用Dog类的object打印所有属性时,会显示一个错误,显示为“


<> P>可以使用单个下划线,Python不使用隐式访问说明符,如C++或java,而是使用特殊的名称约定:名称为“代码>< /COD>前缀A”re表示受保护,而带有
\uuuuu
的名称表示私有。此外,python不会检查您是否违反该约定,在类之外访问受保护或私有方法被认为是一种不好的做法。如果名称以双下划线开头,则会以特殊方式损坏。因此
\uu name
实际上变成了
\nIMALL No.<代码>当你在<代码>动物< /COD>类和<>代码> O.DooG.No.<代码>中使用它时,在<代码>狗< /代码> .< /P> < P>从双下划线开始的成员是私有的,因此它们不能从CILD类访问。应该使用单个下划线。Python不使用隐式访问说明符,如C++或java BU相反,使用了一种特殊的名称约定:前缀为
\uu
的名称是受保护的,前缀为
\u
的名称是私有的。此外,python不会检查您是否违反该约定,在类之外访问受保护或私有方法被认为是一种不好的做法。如果您以双下划线开头名称是以一种特殊的方式损坏的。所以当你在
动物
类中使用它时,
\uu name
实际上变成了
\u Animal\uu name
,当你在
中使用它时,
\u Dog\uu name
,问题是你名字中的双下划线前缀。它们会触发名称损坏


你应该避免使用这些。它们不会达到你期望的效果。

问题是你的名字中有双下划线前缀。它们会导致名字被弄乱


你应该避免使用这些。它们不会达到你期望的效果。

在Python中使用双下划线会产生一个变量“private”。这类似于在其他语言中使用
private
关键字。如果你想访问父类之外的属性,你需要删除它们

委员会:

由于类私有成员有一个有效的用例(即避免名称与子类定义的名称发生名称冲突),因此对这种称为名称混乱的机制的支持有限。任何形式的标识符(至少两个前导下划线,最多一个尾随下划线)以文本形式替换为_classname u spam,其中classname是当前类名,去掉前导下划线。只要标识符出现在类的定义中,则不考虑标识符的语法位置。(强调我的)


在Python中使用双下划线使变量成为“private”。这类似于在其他语言中使用
private
关键字。如果要访问父类之外的属性,则需要删除它们

委员会:

由于类私有成员有一个有效的用例(即避免名称与子类定义的名称发生名称冲突),因此对这种称为名称混乱的机制的支持有限。任何形式的标识符(至少两个前导下划线,最多一个尾随下划线)以文本形式替换为_classname u spam,其中classname是当前类名,去掉前导下划线。只要标识符出现在类的定义中,则不考虑标识符的语法位置。(强调我的)


通过将双下划线更改为单下划线解决了问题。感谢帮助!通过将双下划线更改为单下划线解决了问题。感谢帮助!
*line 73, in tostring
    return '{} is {} cm tall and {} kilograms and says {} His owner is {}'.format(self.__name,
AttributeError: 'Dog' object has no attribute '_Dog__name'*