【发布时间】:2017-11-12 17:52:14
【问题描述】:
我刚开始使用 Python,但我无法弄清楚为什么我在使用如此简单的类继承时会遇到问题,尽管我一直在关注本教程的常见用法,但我还没有看到任何人其他在 Stack Overflow 上遇到此问题。这是代码(别担心,没什么复杂的):
import random
import sys
import os
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 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')
print(cat.toString())
bird = Animal ('Flutie', 33, 10, 'tweet')
print(bird.toString())
class Dog(Animal):
def __init__(self, name, height, weight, sound):
super(Dog, self).__init__(name, height, weight, sound)
def toString(self):
return "{} is {} cm tall and {} kilograms and says {}".format(self.__name,
self.__height,
self.__weight,
self.__sound)
spot = Dog ('Spot', 53, 27, "Woof")
print(spot.toString())
...这是输出:
Whiskers is 33 cm tall and 10 kilograms and says meow
Flutie is 33 cm tall and 10 kilograms and says tweet
Traceback (most recent call last):
File "C:/.../animal_test.py", line 72, in <module>
print(spot.toString())
File "C:/.../animal_test.py", line 65, in toString
return "{} is {} cm tall and {} kilograms and says {}".format(self.__name,
AttributeError: 'Dog' object has no attribute '_Dog__name'
【问题讨论】:
-
属性名中的双下划线在python中有特殊含义:stackoverflow.com/questions/1301346/…
-
除了名称修饰问题之外,在类级别设置
__name = ''等可能不会像您想的那样,在这里没有任何作用,并且可能会导致以后出现问题。跨度> -
Python != Java。停止编写双下划线名称损坏的属性除非这是你想要的,你正在尝试创建类本地引用,这肯定不是你想要的,因为你正在尝试访问子类中的属性。停止在类级别编写属性,您只会在实例级别进行隐藏,即
__name = ""这几乎肯定不会像您认为的那样做。不要写toString方法,使用__str__。 -
出于好奇,你在学习什么教程?
-
@PlatypusEgg 我对该教程持高度怀疑态度。只需快速浏览一下,此人就具有教你 Java 中的 Python 的所有经典迹象。他们在条件语句周围使用括号:
if (something is something):。他们使用错误的分号结束行。由于我上面提到的事情,类定义的示例完全不是pythonic。他还教你编写 getter 和 setter,这不是你在 Python 中做的封装。它们可能来自 Java/C++ 。如果您想学习 Python,请获取更好的 Python 教程。
标签: python name-mangling