Python 属性错误:';狗';对象没有属性'_狗的名字';

Python 属性错误:';狗';对象没有属性'_狗的名字';,python,Python,我写了这段Python代码 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.__s

我写了这段Python代码

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 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.__wright = 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', 33, 10, 'Meow')   
Dog = Animal('spot', 50, 20, 'Woof')
katzy = Animal('Mr.Katzy', 180, 50, 'i love fat Cats')

#print(cat.toString())
#print(Dog.toString())
#print(katzy.toString())


class Dog(Animal):
    __owner = ''

    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 {} and his owner is {}".format(self.__name,
                                                                                   self.__height,
                                                                                   self.__weight,
                                                                                   self.__sound,
                                                                                   self.__owner)

Doggo = Dog('spot', 50, 20, 'Woof', 'Preetam')

print(Doggo.toString())
这个错误来了

line 67, in toString
    return"{} is {} cm tall and {} kilograms and says {} and his owner is {}".format(self.__attrname,
AttributeError: 'Dog' object has no attribute '_Dog__attrname'

Process finished with exit code 1
我不明白我是在哪里做的。你们谁能帮我一下吗


因此,他们说我必须在其中添加更多细节,但我不知道还要添加什么。

问题是,您的私有属性名称使用了双下划线,这在Python中具有特殊意义:

从:

格式为
\uuuu spam
的任何标识符(至少两个前导下划线,最多一个尾随下划线)以文本形式替换为
\u classname\uuuuu spam
,其中
classname
是带前导下划线的当前类名。只要标识符出现在类的定义中,就可以在不考虑标识符的语法位置的情况下进行修改

用单个属性替换所有“dunder”属性可以解决此问题:

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 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._wright = 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)

class Dog(Animal):
_owner = ''

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 {} and his owner is {}".format(self._name,
                                                                               self._height,
                                                                               self._weight,
                                                                               self._sound,
                                                                               self._owner)

Doggo = Dog('spot', 50, 20, 'Woof', 'Preetam')

print(Doggo.toString())

问题是您对私有属性名称使用了双下划线,这在Python中有特殊意义:

从:

格式为
\uuuu spam
的任何标识符(至少两个前导下划线,最多一个尾随下划线)以文本形式替换为
\u classname\uuuuu spam
,其中
classname
是带前导下划线的当前类名。只要标识符出现在类的定义中,就可以在不考虑标识符的语法位置的情况下进行修改

用单个属性替换所有“dunder”属性可以解决此问题:

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 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._wright = 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)

class Dog(Animal):
_owner = ''

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 {} and his owner is {}".format(self._name,
                                                                               self._height,
                                                                               self._weight,
                                                                               self._sound,
                                                                               self._owner)

Doggo = Dog('spot', 50, 20, 'Woof', 'Preetam')

print(Doggo.toString())
试试这个:

class Dog(Animal):
        __owner = ''

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

        def set_owner(self, owner):
           self.__owner = owner
与此相反:

class Dog(Animal):
    __owner = ''

    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
试试这个:

class Dog(Animal):
        __owner = ''

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

        def set_owner(self, owner):
           self.__owner = owner
与此相反:

class Dog(Animal):
    __owner = ''

    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

您发布的代码未显示此错误。它只会在您编写了self.\uuu attrname时显示,但您没有。无论如何,您不应该对私有属性使用双下划线,请仅使用与您要求的内容无关的一个,但为什么您要同时定义两个类属性
\uu name
\uu height
等(高于
\uu init\uuu
)和实例属性
\uuuu name
\uuu height
(内部
\uuuu init\uuuu
)?上面的
\uuuu init\uuuu
可能无法实现您的期望,您也不需要它。至于您的问题,请参阅@Matiasceroth的答案您发布的代码没有显示此错误。它只会在您编写了self.\uuu attrname时显示,但您没有。无论如何,您不应该对私有属性使用双下划线,请仅使用与您要求的内容无关的一个,但为什么您要同时定义两个类属性
\uu name
\uu height
等(高于
\uu init\uuu
)和实例属性
\uuuu name
\uuu height
(内部
\uuuu init\uuuu
)?上面的
\uuuu init\uuuu
可能无法实现您的期望,您也不需要它。至于你的问题,请看@Matiascero的答案