属性装饰器
本课属于 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。这样既能进行数据验证和计算值,又能保留简单的属性访问语法。
挑战
中等在 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: 使用与之前相同的格式这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Python 在线编译器