其他分享
首页 > 其他分享> > 子类不能从超类正确继承结构

子类不能从超类正确继承结构

作者:互联网

这个问题已经在这里有了答案:            >            What is the meaning of a single and a double underscore before an object name?                                    14个
我刚开始使用Python,但是我无法弄清楚为什么我对这样的简单类继承有问题,尽管我一直遵循本教程的常用用法,但我在堆栈上没有见过其他人溢出遇到此问题.这是代码(不用担心,没有什么太复杂的):

import random
import sys
import os

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 toString(self):
        return "{} is {} cm tall and {} kilograms and says {}".format(self.__name,
                                                                      self.__height,
                                                                      self.__weight,
                                                                      self.__sound)

cat = Animal ('Whiskers', 33, 10, 'meow')
print(cat.toString())

bird = Animal ('Flutie', 33, 10, 'tweet')
print(bird.toString())

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.__name,
                                                                      self.__height,
                                                                      self.__weight,
                                                                      self.__sound)

spot = Dog ('Spot', 53, 27, "Woof")

print(spot.toString())

…这是输出:

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'

解决方法:

双下划线代表name mangling.

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

从字面上解释为:

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

不论在何处调用或由谁调用__init__,前缀_Animal都会出现,因为它实际上位于Animal类下.

但是,当您在此处使用属性时,由于它实际上位于Dog类下,因此名称被改成:

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._Dog__name的属性,而是具有self._Animal__name的属性.

标签:name-mangling,python
来源: https://codeday.me/bug/20191025/1932507.html