Python 进阶
封装与属性
使用私有属性和 property 控制访问
- 理解封装概念
- 使用私有属性(约定)
- @property 装饰器
私有属性约定
示例代码(可运行)
Python 0%
ℹ️Python 的封装
Python没有真正的私有。双下划线__x会被改写成_ClassName__x,这是名称改写。单下划线x是约定俗成的请勿外部访问信号。
🐍资深工程师经验谈
面向对象设计有五大原则(SOLID):单一职责(一个类只做一件事)、开闭原则(对扩展开放、对修改关闭)、里氏替换(子类能替换父类)、接口隔离(不要强迫依赖不需要的方法)、依赖倒置(依赖抽象而非具体实现)。但在 Python 实战中,不要过度设计——很多场景用函数和 dataclass 就够了。「组合优于继承」是更实用的建议:如果只是为了复用代码,优先用组合(把功能拆成小组件类)而不是深层继承树。
@property 属性装饰器
示例代码(可运行)
Python 0%
预测输出
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验证。
封装挑战
Python 0%
2 个测试用例
课后作业
只读属性
中等+20 XP
实现Circle类,radius可读写,area只读。
只读属性
Python 0%
1 个测试用例