请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

子类私有属性还是'_父类名__xxx'

class User(object):
    def __init__(self, name, age):
        self.name = name
        self.__age = age

    def get_age(self):
        return self.__age

    def __get_name(self):
        return self.name


class Student(User):
    pass


stu = Student('LiMing', 23)
print(dir(stu))
$ python private_method.py
['_User__age', '_User__get_name', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__'
, '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'get_age', 'name']

$ python --version
Python 3.7.4

私有属性__age变为_User__age,而不是_Student__age
私有方法__get_name变为_User__get_name,而不是_Student__get_name

请问是什么原因呢?需要怎么修改代码?

正在回答

1回答

合理啊,课程讲解过这个原理啊, 属性的查找顺序, age和方法都是属于user, 通过student能访问不是因为这两个变量变成了student的而是student中有个指针指向了user而已, 这个我在课程中详细的讲解过的吧

0 回复 有任何疑惑可以回复我~
  • 提问者 多收能量多种树 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2020-05-09 15:14:12
  • 提问者 多收能量多种树 #2
    又看了一遍视频,发现自己当时听漏了,视频里讲 Student有同名属性`__age`的时候,才会变成`_Student__age`。就是此时`__age`是Student自己的,而不是父类的。
    
    试了一下,代码改成这样就好了
    
    ```python
    class Student(User):
        def __init__(self, name, age):
            self.name = name
            self.__age = age
    
        def __get_name(self):
            return self.name
    ```
    
    此时就是`_Student__age`和`_Student__get_name`了
    回复 有任何疑惑可以回复我~ 2020-05-09 15:32:47
  • bobby 回复 提问者 多收能量多种树 #3
    正解。
    回复 有任何疑惑可以回复我~ 2020-05-10 12:00:57
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信