简介
Python 属性装饰器是一种强大且灵活的技术,它允许开发者动态地修改或增强类属性和方法的行为。本教程将探讨属性装饰器的基本概念、实现模式和实际用例,为开发者提供编写更优雅、更易于维护的 Python 代码的高级技巧。
Python 属性装饰器是一种强大且灵活的技术,它允许开发者动态地修改或增强类属性和方法的行为。本教程将探讨属性装饰器的基本概念、实现模式和实际用例,为开发者提供编写更优雅、更易于维护的 Python 代码的高级技巧。
在 Python 中,装饰器是一种强大且灵活的方式,用于修改或增强函数和类,而无需直接更改其源代码。它们本质上是将另一个函数作为参数,并返回该函数的修改版本的函数。
一个简单的装饰器看起来像这样:
def my_decorator(func):
def wrapper():
print("在函数被调用之前执行一些操作。")
func()
print("在函数被调用之后执行一些操作。")
return wrapper
@my_decorator
def say_hello():
print("你好!")
say_hello()
Python 中有几种类型的装饰器:
| 装饰器类型 | 描述 |
|---|---|
| 函数装饰器 | 修改函数的行为 |
| 类装饰器 | 修改或增强类 |
| 方法装饰器 | 修改类中的方法 |
装饰器也可以处理带参数的函数:
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"正在调用函数:{func.__name__}")
result = func(*args, **kwargs)
print(f"函数 {func.__name__} 已完成")
return result
return wrapper
@log_decorator
def add(a, b):
return a + b
print(add(3, 5))
functools.wraps 保留原始函数的元数据@functools.wraps 保留函数元数据通过理解这些基础知识,在你的 LabEx 编程之旅中,你已经在掌握 Python 装饰器的道路上迈出了坚实的一步。
Python 中的属性装饰器是一种特殊的装饰器,用于修改或控制类中属性的访问、创建和操作。
@property 装饰器允许对类属性进行受控访问:
class Temperature:
def __init__(self, celsius):
self._celsius = celsius
@property
def fahrenheit(self):
return (self._celsius * 9/5) + 32
@property
def celsius(self):
return self._celsius
@celsius.setter
def celsius(self, value):
if value < -273.15:
raise ValueError("温度低于绝对零度是不可能的")
self._celsius = value
| 装饰器 | 用途 | 使用场景 |
|---|---|---|
@property |
创建受管理的属性 | 受控的属性访问 |
@classmethod |
定义在类上操作的方法 | 替代构造函数 |
@staticmethod |
创建独立于实例的方法 | 实用函数 |
def validate_type(expected_type):
def decorator(func):
def wrapper(self, value):
if not isinstance(value, expected_type):
raise TypeError(f"期望的类型是 {expected_type.__name__}")
return func(self, value)
return wrapper
return decorator
class User:
def __init__(self):
self._age = None
@validate_type(int)
def set_age(self, age):
self._age = age
class PositiveNumber:
def __init__(self, name):
self.name = name
def __get__(self, instance, owner):
return instance.__dict__.get(self.name, None)
def __set__(self, instance, value):
if value <= 0:
raise ValueError("必须是正数")
instance.__dict__[self.name] = value
class Product:
price = PositiveNumber('price')
quantity = PositiveNumber('quantity')
def __init__(self, name, price, quantity):
self.name = name
self.price = price
self.quantity = quantity
在你的 LabEx Python 项目中探索这些模式,以编写更优雅、更健壮的代码。
import time
import functools
def timer_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} 执行耗时 {end_time - start_time:.4f} 秒")
return result
return wrapper
class DataProcessor:
@timer_decorator
def process_large_dataset(self, data):
## 模拟复杂的数据处理
return [item * 2 for item in data]
def require_auth(role):
def decorator(func):
@functools.wraps(func)
def wrapper(self, *args, **kwargs):
if not self.is_authenticated:
raise PermissionError("用户未认证")
if self.user_role!= role:
raise PermissionError(f"需要 {role} 角色")
return func(self, *args, **kwargs)
return wrapper
return decorator
class UserManager:
def __init__(self, user_role, is_authenticated):
self.user_role = user_role
self.is_authenticated = is_authenticated
@require_auth('admin')
def delete_user(self, user_id):
print(f"正在删除用户 {user_id}")
def memoize(func):
cache = {}
@functools.wraps(func)
def wrapper(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrapper
class MathOperations:
@memoize
def fibonacci(self, n):
if n < 2:
return n
return self.fibonacci(n-1) + self.fibonacci(n-2)
| 类别 | 用途 | 示例装饰器 |
|---|---|---|
| 日志记录 | 跟踪函数调用 | 性能监测 |
| 安全 | 控制访问 | 认证 |
| 缓存 | 优化性能 | 记忆化 |
| 验证 | 确保数据完整性 | 类型检查 |
def retry(max_attempts=3, delay=1):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
attempts = 0
while attempts < max_attempts:
try:
return func(*args, **kwargs)
except Exception as e:
attempts += 1
if attempts == max_attempts:
raise
time.sleep(delay)
return wrapper
return decorator
class NetworkService:
@retry(max_attempts=3, delay=2)
def fetch_data(self, url):
## 模拟网络请求
import random
if random.random() < 0.5:
raise ConnectionError("网络错误")
return "数据成功获取"
在你的 LabEx Python 项目中探索这些实际用例,以编写更复杂、高效的代码。
通过掌握 Python 属性装饰器,开发者可以改变代码的功能,实现复杂的元编程技术,并创建更具模块化和可复用性的软件组件。本教程中学到的技术能让你更深入地理解 Python 的动态编程能力,并提供改进代码设计和性能的实用策略。