一个类继承的问题

写了一个父类 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'

求大大解答,没看懂这个错误,感谢!

阅读 2.1k
3 个回答

恭喜你即将学到一个python机制了。这个机制是这样的,因为python本身对类属性没有所谓的私有的概念,这意味着任何人都可以查看类的属性,因此出了一个 名称改写 的机制。

Python 解释器在运行时自动把私有属性 __x (即双下划线开头) 的属性重命名为 _MyClass__x 。这样别人用 __x 来读取时就会报出没有这个属性的异常。从而达到“私有”。其实这种机制如果懂了也会被恶意读取的。

如果题主觉得这个机制不好理解,建议就不要使用双下划线开头的作为属性了。

你把前边的self.__name下划线去掉应该就好了吧。__xxx代表的是xxx是一个私有属性。
即self.__name=>self.name

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.eating()
cat.running()

把__name里的双下划线去掉。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题