Menu
CoddyTech

属性装饰器

本课属于 Coddy Python 学习旅程的“面向对象编程”单元。第 14 课,共 64 课。

属性装饰器让你可以控制属性的访问和修改方式,同时保留简洁的属性语法。

下面是一个包含属性 getter 的类示例:

class Person:
    def __init__(self, name, age):
        self._name = name
        self._age = age
    
    @property
    def age(self):
        return self._age

像使用普通属性一样使用这个属性:

person = Person("Alice", 30)
print(person.age)

输出:

30

注意,你访问 age 时没有加括号,尽管实际上这是在调用一个方法。

添加 setter,在设置值时验证数据:

class Person:
    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 value < 0:
            raise ValueError("Age cannot be negative")
        self._age = value

现在,你可以通过自动验证来设置年龄:

person = Person("Alice", 30)
person.age = 31     # 使用带验证的 setter
print(person.age)   # 使用 getter

# 这样会引发错误:
# person.age = -5   # ValueError: 年龄不能为负数

输出:

31

创建用于计算值的计算属性:

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, 3)
print(rect.area)  # 计算 5 * 3 = 15

输出:

15

重点:属性装饰器可以让方法看起来像属性。使用 @property 定义 getter,使用 @attribute_name.setter 定义 setter。这样既能进行数据验证和计算值,又能保留简单的属性访问语法。

challenge icon

挑战

中等

在 temperature.py 中完成 Temperature 类,实现摄氏度和华氏度之间的转换。然后在 driver.py 中使用这个类测试温度转换。按照两个文件中的 TODO 注释逐步操作。

将每次转换打印为 [celsius]°C is [fahrenheit]°F,摄氏度值必须与给定值完全一致,华氏度值则使用 Python 计算出的结果。不要对数字进行舍入或格式化。driver 输出的两行内容如下:

25°C is 77.0°F
37.0°C is 98.6°F

亲手试试

# TODO: 从 temperature 模块导入 Temperature 类

# 测试这个类:
# TODO: 创建一个温度为 25°C 的实例
temp = None  # 替换为实际的 Temperature 实例

# TODO: 打印摄氏温度值和华氏温度值
# TODO: 使用以下格式:"25°C is 77.0°F"(直接打印两个值,不要四舍五入或设置格式)

# TODO: 将温度设置为 98.6°F

# TODO: 再次打印两个值,确认转换正确
# TODO: 使用与之前相同的格式
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Python 在线编译器