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

来源:4-8 数据封装和私有属性

多收能量多种树

2020-04-15

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回答

bobby

2020-04-16

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

0
3
bobby
回复
多收能量多种树
正解。
2020-05-10
共3条回复

Python3高级核心技术97讲,高级进阶的必学课程

socket编程/多线程/多进程/线程池/asyncio并发编程/协程和异步IO

2121 学习 · 551 问题

查看课程