20 分钟
Python 进阶

封装与属性

使用私有属性和 property 控制访问

  • 理解封装概念
  • 使用私有属性(约定)
  • @property 装饰器

私有属性约定

示例代码(可运行)
ℹ️Python 的封装

Python没有真正的私有。双下划线__x会被改写成_ClassName__x,这是名称改写。单下划线x是约定俗成的请勿外部访问信号。

🐍资深工程师经验谈

面向对象设计有五大原则(SOLID):单一职责(一个类只做一件事)、开闭原则(对扩展开放、对修改关闭)、里氏替换(子类能替换父类)、接口隔离(不要强迫依赖不需要的方法)、依赖倒置(依赖抽象而非具体实现)。但在 Python 实战中,不要过度设计——很多场景用函数和 dataclass 就够了。「组合优于继承」是更实用的建议:如果只是为了复用代码,优先用组合(把功能拆成小组件类)而不是深层继承树。

@property 属性装饰器

示例代码(可运行)
预测输出
class C:
    def __init__(self):
        self.__x = 42
c = C()
print(c._C__x)
找 Bug双下划线属性会被名称改写,c.__x不存在。
class C: def __init__(self): self.__x = 1 c = C() print(c.__x)
填空题填写空白处的代码
class C: def __init__(self): self.x = 10 # 私有属性 @property def x(self): return self.x
选择题

@property 的作用?

选择题

要让 @property 包装的属性支持赋值,需要再定义?

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

list 底层是一段连续的指针数组,容量不够时整体扩容(CPython 约按 1.125 倍)。因此按下标取元素是 O(1),末尾 append 均摊 O(1),但在头部 insert(0,…) 或 pop(0) 要搬动全部元素、是 O(n)。dict/set 基于哈希表,平均查找 O(1) 但更耗内存。选对数据结构,往往比抠语法更影响性能。

挑战任务

封装挑战

简单+50 XP

实现Student类,成绩0-100验证。

封装挑战
2 个测试用例

课后作业

只读属性

中等+20 XP

实现Circle类,radius可读写,area只读。

只读属性
1 个测试用例