目录
第四阶段:特殊方法与高级特性
第 9 周:了解属性装饰器
周一
- 上午
- 理论学习
- 阅读 Python 官方文档及相关教程,了解属性装饰器的基本概念。明确属性装饰器是 Python 提供的一种语法糖,用于简化属性的访问控制逻辑,将方法伪装成属性,使代码更简洁、易读。
- 学习属性装饰器与传统属性访问方式的区别,理解使用属性装饰器在代码封装性、可维护性方面的优势。
- 笔记整理
- 记录属性装饰器的定义、作用和常见使用场景,对比不同访问方式的特点。
- 理论学习
- 下午
- 代码示例研究
- 查找简单的使用属性装饰器的 Python 代码示例,重点关注
property
装饰器的基本用法。分析示例中如何将一个方法转换为只读属性。 - 在本地环境运行示例代码,观察输出结果,体会
property
装饰器的效果。
- 查找简单的使用属性装饰器的 Python 代码示例,重点关注
- 代码示例研究
周二
- 上午
- 深入学习
property
装饰器- 详细研究
property
装饰器的语法结构和工作原理。了解property
函数可以接受getter
、setter
和deleter
方法作为参数,从而实现对属性的读取、赋值和删除操作的控制。 - 学习如何使用
@property
语法糖来创建只读属性,通过一个简单的类(如Rectangle
类)来实现一个只读的面积属性。
- 详细研究
- 深入学习
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
return self.width * self.height
rect = Rectangle(5, 10)
print(rect.area)
- 代码调试与验证
- 运行代码,检查面积属性是否能正确计算和访问。尝试修改代码中的属性值,再次访问面积属性,确认其结果是否符合预期。
- 下午
- 拓展思考
- 思考只读属性在实际项目中的应用场景,如一些计算得到的属性,不希望被外部随意修改的情况。
- 分析使用
property
装饰器实现只读属性与直接定义普通方法的优缺点。
- 拓展思考
周三
- 上午
- 学习
setter
方法- 研究如何使用
@<property_name>.setter
装饰器为属性添加赋值方法,实现属性的可写性。理解setter
方法的参数和逻辑,它通常用于对赋值进行合法性检查。 - 在
Rectangle
类中添加width
属性的setter
方法,确保宽度值为正数。
- 研究如何使用
- 学习
class Rectangle:
def __init__(self, width, height):
self._width = width
self.height = height
@property
def width(self):
return self._width
@width.setter
def width(self, value):
if value <= 0:
raise ValueError("Width must be a positive number")
self._width = value
rect = Rectangle(5, 10)
rect.width = 8
print(rect.width)
- 异常处理测试
- 运行代码,测试
setter
方法的异常处理功能。尝试给width
属性赋一个负数,观察是否抛出预期的异常。
- 运行代码,测试
- 下午
- 总结规律
- 总结
setter
方法的编写规则和注意事项,包括参数的定义、合法性检查的逻辑和异常处理的方式。 - 思考在哪些情况下需要为属性添加
setter
方法,以及如何设计合理的赋值逻辑。
- 总结
- 总结规律
周四
- 上午
- 学习
deleter
方法- 了解
@<property_name>.deleter
装饰器的作用,它用于定义属性的删除操作。掌握deleter
方法的实现逻辑,通常用于清理与属性相关的资源或进行状态重置。 - 在
Rectangle
类中添加width
属性的deleter
方法,在删除属性时将宽度重置为默认值。
- 了解
- 学习
class Rectangle:
def __init__(self, width, height):
self._width = width
self.height = height
@property
def width(self):
return self._width
@width.setter
def width(self, value):
if value <= 0:
raise ValueError("Width must be a positive number")
self._width = value
@width.deleter
def width(self):
self._width = 1
rect = Rectangle(5, 10)
del rect.width
print(rect.width)
- 删除操作验证
- 运行代码,验证
deleter
方法的功能。检查删除属性后,属性值是否被正确重置。
- 运行代码,验证
- 下午
- 综合应用思考
- 思考如何将
getter
、setter
和deleter
方法结合使用,实现对属性的全面访问控制。分析在一个复杂的类中,如何合理设计属性的访问和修改逻辑。 - 研究属性装饰器在不同类型属性(如实例属性、类属性)上的应用差异。
- 思考如何将
- 综合应用思考
周五
- 上午
- 综合案例实践
- 设计一个更复杂的类,如
Person
类,包含多个属性(如姓名、年龄、身高),并使用属性装饰器对这些属性进行访问控制。在setter
方法中添加更复杂的合法性检查逻辑,如年龄必须在合理范围内,身高不能为负数等。
- 设计一个更复杂的类,如
- 综合案例实践
class Person:
def __init__(self, name, age, height):
self._name = name
self._age = age
self._height = height
@property
def name(self):
return self._name
@name.setter
def name(self, value):
if not isinstance(value, str):
raise ValueError("Name must be a string")
self._name = value
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if not (0 <= value <= 120):
raise ValueError("Age must be between 0 and 120")
self._age = value
@property
def height(self):
return self._height
@height.setter
def height(self, value):
if value < 0:
raise ValueError("Height cannot be negative")
self._height = value
person = Person("Alice", 25, 170)
person.age = 30
print(person.age)
- 代码优化与调试
- 对代码进行优化,添加必要的注释,提高代码的可读性。运行代码,进行全面的测试,检查属性的访问、赋值和删除操作是否都能正常工作。
- 下午
- 本周总结
- 回顾本周学习的属性装饰器知识,整理代码示例和笔记。总结
property
装饰器、setter
方法和deleter
方法的使用方法、应用场景和注意事项。 - 思考属性装饰器在实际项目中的应用潜力,以及如何利用它们来提高代码的质量和可维护性。同时,为下周的综合项目实践做好准备,思考如何将属性装饰器融入到综合项目中。
- 回顾本周学习的属性装饰器知识,整理代码示例和笔记。总结
- 本周总结
总结
一、学习内容回顾
- 理论学习
- 系统学习了属性装饰器的概念和作用。属性装饰器是 Python 提供的一种语法糖,用于对类的属性进行访问控制和封装,使得属性的访问和修改可以通过方法来实现,增强了代码的安全性和可维护性。
- 重点掌握了
property
装饰器的使用方法。property
装饰器可以将一个方法转换为属性,使得我们可以像访问普通属性一样访问该方法的返回值,同时还可以通过setter
和deleter
方法对属性进行赋值和删除操作。
- 代码实践
- 设计了一个
Circle
类,使用property
装饰器实现了对圆的半径属性的访问控制。
- 设计了一个
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value < 0:
raise ValueError("Radius cannot be negative")
self._radius = value
@radius.deleter
def radius(self):
del self._radius
c = Circle(5)
print(c.radius)
c.radius = 10
print(c.radius)
try:
c.radius = -2
except ValueError as e:
print(e)
del c.radius
- 通过上述代码,验证了
property
装饰器的功能。可以看到,通过@property
装饰的radius
方法可以像属性一样被访问,通过@radius.setter
装饰的方法可以对属性进行赋值并进行有效性检查,通过@radius.deleter
装饰的方法可以删除属性。
二、问题与解决
- 问题
- 在理解
property
装饰器的工作原理和语法结构时遇到了一些困难,特别是setter
和deleter
方法的定义和使用。 - 在实现属性访问控制时,对于如何正确处理属性赋值和删除时的异常情况缺乏经验。
- 在理解
- 解决方法
- 通过阅读官方文档和相关教程,深入研究了
property
装饰器的实现机制,理解了@property
、@<property_name>.setter
和@<property_name>.deleter
之间的关联和作用。同时,参考了大量的代码示例,学习了如何正确定义和使用这些装饰器。 - 对于异常处理问题,学习了 Python 的异常处理机制,在
setter
方法中添加了对非法输入的检查,并使用raise
语句抛出相应的异常,确保属性赋值的合法性。
- 通过阅读官方文档和相关教程,深入研究了
三、学习成果
本周成功掌握了 property
装饰器的使用方法,能够在自定义类中使用 property
装饰器实现属性的访问控制,增强了类的封装性和安全性。通过实践,加深了对属性装饰器在 Python 面向对象编程中重要性的理解,提高了代码的健壮性和可维护性。
四、下周计划
下周将进行综合复习与实践,完成一个综合的面向对象编程项目,将之前所学的继承、多态、特殊方法和属性装饰器等知识进行整合和应用,巩固所学知识,提升实际编程能力。