当我运行此代码时。我收到以下错误
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())
答案 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。不是每个人都使用 这一点 - 我们根本不在工作的地方 - 而且对于简单的课程感觉如此 就像使用单一的略有荒谬和恼人的替代品一样 领先的下划线。
然而,有理由存在它;如果您正在使用 如果你只使用单个前导下划线,那么很多继承 你没有办法告诉有人读你的代码 私密'之间的区别并且'受保护'变量 - 那些 甚至不打算通过子类访问它们 子类可以访问,但外部世界可能不访问。用一个 单尾跟下划线表示受保护'和双下划线 表示私人'因此可能是一个有用的惯例 情况(名称修改将允许子类使用 变量在其子类中具有相同的名称而不会导致 碰撞)。