写了一个父类 Animal
,用 Cat
去继承了 Animal
,并为 Cat
新增了一个方法 eating()
。
class Animal(object):
def __init__(self, name):
self.__name = name
def set_name(self, name):
self.__name = name
def running(self):
print(self.__name,'is running!')
class Cat(Animal):
def eating(self):
print(self.__name,'is eating!')
cat = Cat('Doll')
cat.running()
cat.eating()
希望 cat.eating()
能够输出 Doll is eating!
,但是却报错:
Doll is running!
Traceback (most recent call last):
File "python", line 20, in <module>
File "python", line 16, in eating
AttributeError: 'Cat' object has no attribute '_Cat__name'
求大大解答,没看懂这个错误,感谢!
恭喜你即将学到一个python机制了。这个机制是这样的,因为python本身对类属性没有所谓的私有的概念,这意味着任何人都可以查看类的属性,因此出了一个
名称改写
的机制。Python 解释器在运行时自动把私有属性
__x
(即双下划线开头) 的属性重命名为_MyClass__x
。这样别人用__x
来读取时就会报出没有这个属性的异常。从而达到“私有”。其实这种机制如果懂了也会被恶意读取的。如果题主觉得这个机制不好理解,建议就不要使用双下划线开头的作为属性了。