Python 属性错误:';狗';对象没有属性'_狗的名字';
我写了这段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
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的答案