面向对象设计与Python编程实践学习笔记
学习目标概述
本周主要围绕面向对象编程的核心概念展开学习,涵盖类与对象的设计原理、封装机制、属性访问控制以及异常处理等内容。同时结合《计算机科学概论》第九章和《看漫画学Python》第九、十章的知识点,完成相关阅读与测试任务,并实现基础的数据结构操作伪代码设计。
面向对象设计核心思想
与传统的自顶向下过程式设计不同,面向对象方法强调以"数据"为中心,关注系统中参与交互的实体——即对象。其关键区别如下:
- 设计焦点:面向对象侧重于名词(如人、动物、文件),而过程式设计聚焦动词(如计算、读取、转换)。
- 结构产出:前者生成的是对象及其关系的层级结构;后者构建的是函数或步骤的调用流程图。
- 基本单位:类是创建对象的模板,定义了属性和行为;对象则是类的具体实例。
面向对象三大特性
- 封装:隐藏对象内部状态,仅通过公共接口进行访问。例如使用私有属性(__age)配合getter/setter方法实现安全修改。
- 继承:子类可复用父类的字段和方法,支持代码重用与扩展。
- 多态:同一操作作用于不同对象时,可产生不同的执行结果。
程序执行方式对比
| 方式 | 说明 |
|---|---|
| 汇编 | 将汇编语言翻译为机器码,需依赖特定硬件架构。 |
| 编译 | 源码一次性转为目标平台的可执行文件,运行效率高。 |
| 解释 | 逐行翻译并执行,便于调试但性能较低。 |
| 执行 | 操作系统加载二进制文件并启动进程。 |
代码实践与问题解析
在实际编码过程中遇到关于字符串格式化的问题:为何 format() 能直接嵌入 print() 中?
原因在于:format() 是字符串对象的方法,返回一个格式化后的字符串,因此可以直接作为 print() 的参数传入。
示例一:基础类定义与实例化
class Pet:
def __init__(self, name, age):
self.name = name
self.age = age
pet = Pet("花花", 3)
print("宠物名叫{0},已经{1}岁了。".format(pet.name, pet.age))
示例二:默认参数与关键字初始化
class Animal:
def __init__(self, name, age, gender='未知'):
self.name = name
self.age = age
self.gender = gender
a1 = Animal('小白', 4)
a2 = Animal(name='小黑', gender='雌性', age=6)
print('{0}:{1}岁{2}。'.format(a1.name, a1.age, a1.gender))
print('{0}:{1}岁{2}。'.format(a2.name, a2.age, a2.gender))
示例三:私有属性与访问器
class Dog:
def __init__(self, name, age):
self.name = name
self.__age = age # 私有成员
def get_age(self):
return self.__age
def set_age(self, new_age):
if new_age > 0:
self.__age = new_age
dog = Dog("旺财", 2)
print("当前年龄: {}".format(dog.get_age()))
dog.set_age(5)
print("更新后年龄: {}".format(dog.get_age()))
示例四:使用@property装饰器简化访问
class Dog:
def __init__(self, name, age):
self.name = name
self.__age = age
@property
def age(self):
return self.__age
@age.setter
def age(self, value):
if isinstance(value, int) and value > 0:
self.__age = value
else:
raise ValueError("年龄必须是正整数")
dog = Dog("豆豆", 1)
print(f"初始年龄:{dog.age}")
dog.age = 4
print(f"调整后年龄:{dog.age}")
示例五:自定义异常处理
class InputError(Exception):
def __init__(self, msg):
super().__init__(msg)
n = 8888
user_input = input("请输入除数:")
try:
num = int(user_input)
result = n / num
print(f"{n} ÷ {num} = {result}")
except ZeroDivisionError:
raise InputError("禁止除以零")
except ValueError:
raise InputError("输入内容不是有效整数")
单链表节点插入与删除伪代码
插入节点(在目标节点后)
Algorithm InsertAfter(Node target, Node newNode):
If target is null Then
Return error
EndIf
newNode.next ← target.next
target.next ← newNode
EndAlgorithm
删除节点(移除目标节点的下一个节点)
Algorithm DeleteNext(Node target):
If target is null OR target.next is null Then
Return error
EndIf
temp ← target.next
target.next ← temp.next
Dispose(temp)
EndAlgorithm
错题回顾
题目:递归算法的一般情况决定了递归何时终止。
正确答案:错误
解析:递归的**基本情况**(base case)决定停止条件,而非一般情况。一般情况负责将问题分解并向基本情况推进。
学习进度统计
| 周期 | 新增/累计代码行数 | 新增/累计博客数 | 新增/累计学习时间(小时) |
|---|---|---|---|
| 第一周 | 200 / 200 | 2 / 2 | 20 / 20 |
| 第二周 | 300 / 500 | 2 / 4 | 18 / 38 |
| 第三周 | 500 / 1000 | 3 / 7 | 22 / 60 |
| 第四周 | 300 / 1300 | 2 / 9 | 30 / 90 |
| 第五周 | 700 / 1600 | 5 / 7 | 78 / 110 |
| 第六周 | 900 / 1900 | 7 / 9 | 90 / 130 |
