Flu*_*ert 5 python inheritance
刚刚开始学习 Python,我是 Derek Banas 的粉丝,一直在遵循教程,但我被一些代码困住了。
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", "Seb")
print(spot.tostring())
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Traceback (most recent call last):
File "G:/JetBrains/PyCharm Community Edition 4.5.4/PyCharm Projects/Testing 123/testing objects.py", line 87, in <module>
print(spot.tostring())
File "G:/JetBrains/PyCharm Community Edition 4.5.4/PyCharm Projects/Testing 123/testing objects.py", line 73, in tostring
return "{} is {} cm tall and {} kilograms and say {} His owner is {}".format(self.__name,
AttributeError: 'Dog' object has no attribute '_Dog__name'
Run Code Online (Sandbox Code Playgroud)
由于我之前已经从 vb 编程转过来,“tostring”方法的格式缩进让我有点困惑。我什至尝试将其全部放入一行,但它仍然无法识别从 Animal 类继承的属性“__name”。
如有帮助,将不胜感激。
编辑:
可能值得一提的是,我正在使用 Pycharm 来编写所有这些内容。
这也是动物类
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 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 self.__height
def get_weight(self):
return 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)
Run Code Online (Sandbox Code Playgroud)
您的Animal班级正在使用Name Mangling。来自文档-
由于类私有成员有一个有效的用例(即避免名称与子类定义的名称发生名称冲突),因此对这种称为name mangling的机制的支持有限。该形式的任何标识符
__spam(至少两个前导下划线,最多一个尾随下划线)在文本上都替换为_classname__spam,其中 classname 是删除了前导下划线的当前类名称。
(强调我的)
因此,在Animal定义您的类后,任何名称(例如)__name都会更改为_Animal__name等。您还需要像在Dog类中一样访问它们。
但我认为您实际上不需要使用Name Mangling,如果您不想发生Name Mangling ,则应该避免使用两个前导下划线。
| 归档时间: |
|
| 查看次数: |
1477 次 |
| 最近记录: |