[英]When I run this program in PyCharm I get the following errors
当我运行这段代码时。 我收到以下错误
追溯(最近一次通话):文件“ C:/ Users / Nabeel Hussain Syed / PycharmProjects / Hello World / check.py”,行80,在print(spot.toString())中,文件“ C:/ Users / Nabeel Hussain Syed / PycharmProjects / Hello World / check.py“,第66行,在toString中返回“ {}高{}厘米,{}公斤,说{}。他的所有者是{}”。format(self .__ name,AttributeError: “狗”对象没有属性“ _Dog__name”
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())
名称以双下划线开头的属性被视为“私有”,并且不能从子类访问。 您仍然可以使用_Animal__name
类的名称来访问它们( Animal
是在其中定义属性的父类名称),但这是一种不好的做法。
官方文档中的更多信息: https : //docs.python.org/3.6/tutorial/classes.html#private-variables
双下划线在Python中具有重要意义。 请从以前的堆栈溢出答案中查看此摘录:
双领先下划线
这实际上具有语法意义。 在类范围内引用self .__ var1会调用名称修饰。 从您的类外部,该变量将显示为self._YourClassName__var1而不是self .__ var1。 并不是每个人都使用此功能-我们根本不在我的工作地点-对于简单的课程,使用单个下划线就显得有些荒谬和令人讨厌。
但是,存在理由。 如果您使用大量继承,如果仅使用单个前导下划线,则您将无法指示某人阅读您的代码,即“私有”变量与“受保护”变量之间的区别-甚至不意味着由子类访问,子类可以访问但外部世界不能访问。 因此,在这种情况下,使用单个尾部下划线表示“受保护”,使用双下划线表示“私有”可能是一个有用的约定(名称改写将允许子类在其子类中使用具有相同名称的变量,而不会引起碰撞)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.