Bootstrap

学习计划:第四阶段(第九周)

目录

第四阶段:特殊方法与高级特性

第 9 周:了解属性装饰器

周一

周二

周三

周四

周五

总结

一、学习内容回顾

二、问题与解决

三、学习成果

四、下周计划

第四阶段:特殊方法与高级特性

第 9 周:了解属性装饰器

周一

  • 上午
    • 理论学习
      • 阅读 Python 官方文档及相关教程,了解属性装饰器的基本概念。明确属性装饰器是 Python 提供的一种语法糖,用于简化属性的访问控制逻辑,将方法伪装成属性,使代码更简洁、易读。
      • 学习属性装饰器与传统属性访问方式的区别,理解使用属性装饰器在代码封装性、可维护性方面的优势。
    • 笔记整理
      • 记录属性装饰器的定义、作用和常见使用场景,对比不同访问方式的特点。
  • 下午
    • 代码示例研究
      • 查找简单的使用属性装饰器的 Python 代码示例,重点关注 property 装饰器的基本用法。分析示例中如何将一个方法转换为只读属性。
      • 在本地环境运行示例代码,观察输出结果,体会 property 装饰器的效果。

周二

  • 上午
    • 深入学习 property 装饰器
      • 详细研究 property 装饰器的语法结构和工作原理。了解 property 函数可以接受 gettersetter 和 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 方法的功能。检查删除属性后,属性值是否被正确重置。
  • 下午
    • 综合应用思考
      • 思考如何将 gettersetter 和 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 面向对象编程中重要性的理解,提高了代码的健壮性和可维护性。

四、下周计划

下周将进行综合复习与实践,完成一个综合的面向对象编程项目,将之前所学的继承、多态、特殊方法和属性装饰器等知识进行整合和应用,巩固所学知识,提升实际编程能力。

;