当我在PyCharm中运行此程序时,我收到以下错误

时间:2017-08-10 14:30:44

标签: python runtime-error attributeerror

当我运行此代码时。我收到以下错误

  

Traceback(最近一次调用最后一次):文件“C:/ Users / Nabeel Hussain Syed / PycharmProjects / Hello World / check.py”,第80行,in       打印(spot.toString())     文件“C:/ Users / Nabeel Hussain Syed / PycharmProjects / Hello World / check.py”,第66行,inString       返回“{}是{}厘米高,{}公斤,并说{}。他的主人是{}”。格式(自我.__名称,   AttributeError:'Dog'对象没有属性'_Dog__name'

Open the link of the image to check out the errors.

    class Animal:
    __name = None
    __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 str(self.__height)

    def get_weight(self):
        return str(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)

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

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", "Derek")
print(spot.toString())

2 个答案:

答案 0 :(得分:0)

名称以双下划线开头的属性被视为“私有”,并且无法从子类访问。您仍然可以通过_Animal__name之类的名称访问它们(Animal是定义了属性的父类名称),但这是一种不好的做法。

官方文档中的更多信息:https://docs.python.org/3.6/tutorial/classes.html#private-variables

答案 1 :(得分:0)

双下划线在Python中具有重要意义。请参阅previous stack overflow answer

中的摘录
  

双重下划线

     

这个实际上具有句法意义。参考   来自类范围内的self .__ var1调用名称修改。   从您的课外,该变量将显示为   self._YourClassName__var1而不是self .__ var1。不是每个人都使用   这一点 - 我们根本不在工作的地方 - 而且对于简单的课程感觉如此   就像使用单一的略有荒谬和恼人的替代品一样   领先的下划线。

     

然而,有理由存在它;如果您正在使用   如果你只使用单个前导下划线,那么很多继承   你没有办法告诉有人读你的代码   私密'之间的区别并且'受保护'变量 - 那些   甚至不打算通过子类访问它们   子类可以访问,但外部世界可能不访问。用一个   单尾跟下划线表示受保护'和双下划线   表示私人'因此可能是一个有用的惯例   情况(名称修改将允许子类使用   变量在其子类中具有相同的名称而不会导致   碰撞)。